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

如何告诉 RegEx (. NET 版本)获得最小的有效匹配而不是最大的?

106321 次浏览

非贪婪的操作员,?。像这样:

.*?

对于像 .*.+这样的正则表达式,请附加一个问号(.*?.+?)以匹配尽可能少的字符。如果可以选择匹配 (?:blah)?节,但除非绝对必要,否则不匹配,可以使用类似于 (?:blah){0,1}?的内容。对于重复匹配(使用 {n,}{n,m}语法) ,请附加一个问号以尽可能少地匹配(例如 {3,}?{5,7}?)。

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

非贪婪操作符并不意味着最短的匹配:

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]);