RegEx:最小可能匹配或非贪婪匹配

问题描述 投票:0回答:4

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

.net regex regex-greedy non-greedy
4个回答
293
投票

对于

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

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


98
投票

非贪婪运算符,

?
。像这样:

.*?

74
投票

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.