如何强制正则表达式匹配模式中最长的部分。

AIA*_*AIA 3 .net regex named-captures

我在 .net 中有一个模式,我希望一个字符串与该模式的最长可能部分匹配

Pattern : "I (?<a>[\w\W]*)(want to match (?<b>longest))? available"
or "I ((?<a>[\w\W]*)|(want to match (?<b>longest))?)+ available"
Run Code Online (Sandbox Code Playgroud)

字符串:“我想匹配最长的可用时间”

匹配后我们有:a="想要匹配最长的" , b=""
但我想要:a="" , b="longest"

Sam*_*Sam 5

默认情况下,RegEx 是“贪婪的”,这意味着它会尽可能多地匹配。要使重复变得懒惰,请添加一个?.

I <?a:[\w\W]*?>(want to match <?b:longest>)? available
             ^
Run Code Online (Sandbox Code Playgroud)

这现在将[\w\W]延迟匹配 0+ 个字符,或者换句话说:直到表达式可以继续匹配(一旦它看到want to match longest available等)。

示例: 贪婪懒惰(单击“正则表达式调试器”以查看这些重复中的每一个如何操作)。

同样的想法适用于您的其他表达方式,但是贪婪在不同的位置是一个问题:

I ((?<a>[\w\W]*)|(want to match (?<b>longest))?)+? available
                                                 ^
Run Code Online (Sandbox Code Playgroud)