如何告诉 RegEx(.NET 版本)获得最小的有效匹配而不是最大的匹配?
问问题
93764 次
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 回答