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

Smallest possible match / nongreedy regex search

我最初以为 this answer 会完全解决我的问题,但事实并非如此。

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

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" 提示不起作用?

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

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

Demo

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

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

demo

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

您也可以使用

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

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