【发布时间】:2010-12-27 13:25:16
【问题描述】:
如何告诉 RegEx(.NET 版本)获取最小的有效匹配而不是最大的匹配?
【问题讨论】:
标签: .net regex regex-greedy non-greedy
如何告诉 RegEx(.NET 版本)获取最小的有效匹配而不是最大的匹配?
【问题讨论】:
标签: .net regex regex-greedy non-greedy
对于像.* 或.+ 这样的正则表达式,附加一个问号(.*? 或.+?)以匹配尽可能少的字符。要选择匹配部分(?:blah)?,但除非绝对必要,否则不匹配,请使用(?:blah){0,1}? 之类的内容。对于重复匹配(使用{n,} 或{n,m} 语法)附加一个问号以尝试尽可能少地匹配(例如{3,}? 或{5,7}?)。
regular expression quantifiers 上的文档也可能会有所帮助。
【讨论】:
非贪婪运算符?。像这样:
.*?
【讨论】:
非贪心运算符并不意味着最短的匹配:
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]);
【讨论】:
c[^cb]*b,它会匹配c和b之间的最短路径
START[^START]*?END(其中 START 和 END 是您的开始和结束字符正则表达式)。它本质上意味着“匹配从 START 到 END 之间的字符不再包含 START 的任何内容”