正则表达式:最小匹配或非贪心匹配


Answers:


192

对于诸如.*或的正则表达式.+,请附加问号(.*?.+?)以匹配尽可能少的字符。要有选择地匹配某个部分,(?:blah)?但除非绝对必要,否则不匹配,请使用(?:blah){0,1}?。对于重复匹配(使用{n,}{n,m}语法),请附加一个问号以尝试尽可能少地匹配(例如{3,}?{5,7}?)。

正则表达式量词的文档也可能会有所帮助。


7
我不知道,如果我是唯一遇到这种误会的人,但需要注意的是:虽然确实非贪婪的运算符将匹配尽可能少的字符,但它可能仍然不是一个正在寻找的匹配项对于。关于RegEx标准,“尽可能少的字符”不等于“最短匹配项”。请参阅我的评论下方的答案:使用abcabka.+?k,RegEx将匹配整个字符串。
finefoot '17

Line2“但除非绝对必要,否则不匹配”:这是什么意思?
下雨


45

非贪婪运算符并不表示可能的最短匹配:

abcabk

a.+?k 将匹配整个字符串(在此示例中),而不是仅匹配最后三个符号。

我实际上想找到最小的匹配项。

那是' a'的最后一个可能匹配项,仍然允许k

我想这样做的唯一方法是利用像这样的表达式:

a[^a]+?k


2
或者,当嵌套有匹配项时,从末尾开始以相反的顺序搜索:“(ab(abk)bk)”。
LBogaardt

7
@LBogaardt将如何反向搜索?不要
理解

2
@LBogaardt仍然存在一个问题:如何以相反的顺序进行搜索?可以说我想得到cab。如果我输入的内容是caaacab我搜索的内容a.*?b,则将返回完整字符串,而不是内部的短匹配符。我将如何从中向后搜索b
C4d

3
反转字符串,然后应用正则表达式。
乔纳森·艾伦

3
这是超级有用的。对于像我这样的人来说,尝试理解这里发生的情况是通用形式START[^START]*?END(START和END是您的起始字符和结束字符正则表达式)。从本质
上讲,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.