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

时间:2014-05-21 16:51:18

标签: .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"

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

  匹配后我们有: a =“想要匹配最长”,b =“”
  但我想要: a =“”,b =“最长”

1 个答案:

答案 0 :(得分:3)

默认情况下,RegEx是“贪婪的”,这意味着它将尽可能匹配 。要制作repetition lazy,请添加?

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

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

示例: greedylazy(点击“正则表达式调试器”查看每个重复操作的运行方式)。

同样的想法与你的另一个表达相关,但贪婪在另一个地方是一个问题:

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