正则表达式:最小可能匹配或非贪婪匹配
Posted
技术标签:
【中文标题】正则表达式:最小可能匹配或非贪婪匹配【英文标题】:RegEx: Smallest possible match or nongreedy match 【发布时间】:2010-12-27 13:25:16 【问题描述】:如何告诉 RegEx(.NET 版本)获取最小的有效匹配而不是最大的匹配?
【问题讨论】:
【参考方案1】:对于像.*
或.+
这样的正则表达式,附加一个问号(.*?
或.+?
)以匹配尽可能少的字符。要选择匹配部分(?:blah)?
,但除非绝对必要,否则不匹配,请使用(?:blah)0,1?
之类的内容。对于重复匹配(使用n,
或n,m
语法)附加一个问号以尝试尽可能少地匹配(例如3,?
或5,7?
)。
regular expression quantifiers 上的文档也可能会有所帮助。
【讨论】:
Line2“但除非绝对必要,否则不匹配”:这是什么意思?【参考方案2】:非贪婪运算符?
。像这样:
.*?
【讨论】:
【参考方案3】:非贪心运算符并不意味着最短的匹配:
abcabk
a.+?k
将匹配整个字符串(在此示例中),而不是仅匹配最后三个符号。
我想实际找到可能的最小匹配项。
这是 'a
' 的最后一个可能匹配项,仍然允许所有匹配 k
。
我想这样做的唯一方法是使用如下表达式:
a[^a]+?k
const haystack = 'abcabkbk';
const paternNonGreedy = /a.+?k/;
const paternShortest = /a[^a]+?k/;
const matchesNonGreedy = haystack.match(paternNonGreedy);
const matchesShortest = haystack.match(paternShortest);
console.log('non greedy: ',matchesNonGreedy[0]);
console.log('shortest: ', matchesShortest[0]);
【讨论】:
或倒序搜索,从末尾开始,匹配嵌套时:“(ab(abk)bk)”。 @LBogaardt 如何以相反的顺序搜索?不明白 反转字符串,然后应用正则表达式。 @C4u 试试c[^cb]*b
,它会匹配c
和b
之间的最短路径
这非常有用。对于像我这样试图了解这里发生了什么的人来说,通用形式是START[^START]*?END
(其中 START 和 END 是您的开始和结束字符正则表达式)。它本质上意味着“匹配从 START 到 END 之间的字符不再包含 START 的任何内容”以上是关于正则表达式:最小可能匹配或非贪婪匹配的主要内容,如果未能解决你的问题,请参考以下文章