最小可能匹配/非正则正则表达式搜索

时间:2015-08-02 18:34:18

标签: regex regex-greedy

我首先认为this answer将完全解决我的问题,但事实并非如此。

我有一个像这样的字符串网址:

http://www.someurl.com/some-text-1-0-1-0-some-other-text.htm#id_76

我想提取some-other-text所以基本上,我带有以下正则表达式:

/0-(.*)\.htm/

不幸的是,这与1-0-some-other-text匹配,因为正则表达式是贪婪的。我无法成功使用.*?使其成功,它只是不会改变任何内容,因为您可以看到here

我也尝试使用U修饰符,但它没有帮助。

为什么" nongreedy"提示不起作用?

2 个答案:

答案 0 :(得分:3)

如果您需要获得最接近的匹配,可以使用tempered greedy token

0-((?:(?!0-).)*)\.htm

请参阅demo

正则表达式的惰性版本不起作用,因为正则表达式引擎从左到右分析字符串。它始终处于最左侧位置并检查它是否匹配。所以,在你的情况下,它找到了第一个0-,并对此感到满意。懒惰适用于最右边的位置。在您的情况下,有一个可能的最右侧位置,因此,懒惰匹配无法帮助实现预期的结果。

您也可以使用

0-((?!.*?0-).*)\.htm

如果您有单独的字符串从中提取值,它将起作用。

答案 1 :(得分:0)

您想要排除1-0?如果是这样,您可以使用非捕获组:

(?:1-0-)+(.*?)\.htm

Demo