我正在尝试理解为什么以下正则表达式:\/.+?.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
答案 0 :(得分:4)
您的正则表达式匹配遇到的第一个斜杠和ext
之间的所有内容。这解释了你的比赛。
你现在有两种可能性。您可以选择更复杂的环视,或者只是禁止在两个斜杠之间匹配斜杠:
\/[^\/]+?\.ext\/
(注意:我转义了扩展部分的点,否则它会匹配slash3aext
)
我只是在这里猜测,但我认为你从右到左“思考”(when i encounter .ext i want everything until i encounter a slash to the left
),当你应该从左到右思考时,就像正则表达式检查你的字符串一样
答案 1 :(得分:0)
请改为尝试:
\/[^\/]+?.ext\/
正则表达式引擎从第一个字符起作用,并将继续尝试与每个后续字符的表达式匹配。这就是正则表达式的执行方式。可以这样想想
^.*?\/[^\/]+?\.ext\/.*$