如何告诉 RegEx(.NET 版本)获取最小的有效匹配而不是最大的?
对于
.*
或 .+
等正则表达式,请附加问号(.*?
或 .+?
)以匹配尽可能少的字符。要选择匹配某个部分 (?: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]);
负面的前瞻会有所帮助
示例:
a...a.....a..b
a.*?b => a...a.....a..b
a(((?!a).)*?)b => a..b
a 和 b 可以更大
start...start......start..end
start.*?end => start...start.....start..end
start(((?!start).)*?)end => start..end