有人可以帮我了解为什么以下正则表达式匹配时,我希望它不匹配。
要检查的字符串
/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*PINPUK
与CBD99_PINPUK
开始但这是在
Transfer/
之前,因此引擎回溯并找到了BD99_PINPUK
前面是
C
,不是Transfer/
,因此匹配成功至于解决方法,只需将斜线放在后面
(?<!Transfer)/\w*PINPUK.*(?:csv|txt)$
这迫使
\w*
在斜杠后立即开始,并且模式现在正确地失败了