有人可以帮我了解为什么以下正则表达式匹配时,我希望它不匹配。

要检查的字符串

/opt/lnpsite/ni00/flat/tmp/Med_Local_Bak/ROI_Med_Transfer/CBD99_PINPUK_14934_09_02_2017_12_07_36.txt

正则表达式
(?<!Transfer\/)\w*PINPUK.*(?:csv|txt)$

我期望这不匹配,因为字符串Transfer/出现在0个或多个单词字符之前,后面是字符串PINPUK。如果我将模式从\w*更改为\w{6}以显式匹配6个字符字符,则此正确返回不匹配项。

有人可以帮助我理解为什么我的“单词”字符上的0或更多的量词会导致正则表达式匹配吗?

最佳答案

您的正则表达式模式(?<!Transfer/)\w*PINPUK.*(?:csv|txt)$正在查找\w*PINPUK,而不是紧随其后的Transfer/
给定字符串

/opt/lnpsite/ni00/flat/tmp/Med_Local_Bak/ROI_Med_Transfer/CBD99_PINPUK_14934_09_02_2017_12_07_36.txt

regex引擎将从匹配\w*PINPUKCBD99_PINPUK开始

但这是在Transfer/之前,因此引擎回溯并找到了BD99_PINPUK
前面是C,不是Transfer/,因此匹配成功

至于解决方法,只需将斜线放在后面

(?<!Transfer)/\w*PINPUK.*(?:csv|txt)$

这迫使\w*在斜杠后立即开始,并且模式现在正确地失败了

08-25 23:59