正则表达式:最小可能匹配或非贪婪匹配

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,它会匹配cb之间的最短路径 这非常有用。对于像我这样试图了解这里发生了什么的人来说,通用形式是START[^START]*?END(其中 START 和 END 是您的开始和结束字符正则表达式)。它本质上意味着“匹配从 START 到 END 之间的字符不再包含 START 的任何内容”

以上是关于正则表达式:最小可能匹配或非贪婪匹配的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式贪婪和非贪婪模式

js正则匹配总结

简单聊一聊正则表达式中的贪婪匹配和非贪婪匹配

正则进阶之,回溯, (贪婪* 非贪婪+? 独占++)三种匹配量词

在python中使用正则表达式

Re库的Match对象和Re库的贪婪匹配以及最小匹配