最小可能匹配/非贪婪正则表达式搜索
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
如果您需要获得最接近的匹配,您可以使用 tempered greedy token。
0-((?:(?!0-).)*)\.htm
见demo
你的正则表达式的惰性版本不起作用,因为正则表达式引擎从左到右分析字符串。它总是获得最左边的位置并检查它是否可以匹配。因此,在您的情况下,它找到了第一个 0-
并对此感到满意。懒惰适用于最右边的位置。在您的情况下,最右边的位置有 1 个可能,因此,惰性匹配无法帮助实现预期结果。
您也可以使用
0-((?!.*?0-).*)\.htm
如果您有单独的字符串可以从中提取值,它将起作用。
我最初以为 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
如果您需要获得最接近的匹配,您可以使用 tempered greedy token。
0-((?:(?!0-).)*)\.htm
见demo
你的正则表达式的惰性版本不起作用,因为正则表达式引擎从左到右分析字符串。它总是获得最左边的位置并检查它是否可以匹配。因此,在您的情况下,它找到了第一个 0-
并对此感到满意。懒惰适用于最右边的位置。在您的情况下,最右边的位置有 1 个可能,因此,惰性匹配无法帮助实现预期结果。
您也可以使用
0-((?!.*?0-).*)\.htm
如果您有单独的字符串可以从中提取值,它将起作用。