144

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

4

3 回答 3

248

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

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

于 2009-12-17T07:15:02.417 回答
83

非贪心运算符,?。像这样:

.*?
于 2009-12-17T07:14:11.187 回答
58

非贪心运算符并不意味着最短的匹配:

阿布克

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

于 2014-01-31T11:22:07.753 回答