如何告诉 RegEx (. NET 版本)获得最小的有效匹配而不是最大的?
非贪婪的操作员,?。像这样:
?
.*?
对于像 .*或 .+这样的正则表达式,请附加一个问号(.*?或 .+?)以匹配尽可能少的字符。如果可以选择匹配 (?:blah)?节,但除非绝对必要,否则不匹配,可以使用类似于 (?:blah){0,1}?的内容。对于重复匹配(使用 {n,}或 {n,m}语法) ,请附加一个问号以尽可能少地匹配(例如 {3,}?或 {5,7}?)。
.*
.+
.+?
(?:blah)?
(?:blah){0,1}?
{n,}
{n,m}
{3,}?
{5,7}?
关于 正则表达式量词正则表达式量词的文档可能也有帮助。
非贪婪操作符并不意味着最短的匹配:
Abcabk
a.+?k将匹配整个字符串(在本例中) ,而不是仅匹配最后三个符号。
a.+?k
我希望能找到最小的匹配。
这是最后一个可能的匹配‘ 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]);