奇怪的正则表达不合理的行为

时间:2014-02-18 14:16:54

标签: regex regex-greedy

我正在尝试理解为什么以下正则表达式:\/.+?.ext\/在以下句子中未被检测到:http://slash1/slash2/slash3.ext/slash4

实际上,我只对匹配具有'.ext'扩展名的网址部分感兴趣。 我首先添加unngreedy字符会将范围缩小到更接近的反斜杠,但事实并非如此,它实际匹配://slash1/slash2/slash3.ext/

这是测试它的链接:http://rubular.com/r/CjJZFssQRF

修改 为了防止其他人降落在这里,我最终使用了以下正则表达式:[^\/]+?\.ext 更新了rubular:http://rubular.com/r/FKcBQI50Lm

2 个答案:

答案 0 :(得分:4)

您的正则表达式匹配遇到的第一个斜杠和ext之间的所有内容。这解释了你的比赛。

你现在有两种可能性。您可以选择更复杂的环视,或者只是禁止在两个斜杠之间匹配斜杠:

\/[^\/]+?\.ext\/

(注意:我转义了扩展部分的点,否则它会匹配slash3aext

demo @ regex101

我只是在这里猜测,但我认为你从右到左“思考”(when i encounter .ext i want everything until i encounter a slash to the left),当你应该从左到右思考时,就像正则表达式检查你的字符串一样

答案 1 :(得分:0)

请改为尝试:

\/[^\/]+?.ext\/

正则表达式引擎从第一个字符起作用,并将继续尝试与每个后续字符的表达式匹配。这就是正则表达式的执行方式。可以这样想想

^.*?\/[^\/]+?\.ext\/.*$