为什么这个正则表达式看起来不会在交替中跟随左优先级?

时间:2014-04-04 02:05:03

标签: c# regex

说输入为String1OptionalString2WhatWeWant

另一种输入是String1WhatWeWant

所以我希望匹配WhatWeWant部分,第一部分应该转到前缀。

但是我似乎无法得到这个结果。

跟着正则表达式没有产生预期的效果

(?<=string1optionalstring2|string1)\w+

它仍然匹配optionalstring2而我不知道那是什么。 我认为它更喜欢左全匹配..

2 个答案:

答案 0 :(得分:1)

我认为String1始终存在?然后:

(?:String1)(?:OptionalString2)?\w+

答案 1 :(得分:0)

发生了什么

要理解为什么外观以一种看似不连贯的方式表现,请记住正则表达式引擎从左向右移动并返回它找到的第一个匹配。

让我们看看在(?<=ab|a)\w+上匹配abc所需的步骤:

  • 引擎从a开始。之前没有任何事情,所以后视失败
  • 传输开始,引擎正在考虑从b
  • 开始的匹配
  • lookbehind尝试交替的第一项(ab)失败
  • ...但第二项(a)匹配
  • \w+匹配字符串的其余部分

因此整体匹配为bc,并且正则表达式引擎在此过程中没有破坏其任何规则。

如何修复

如果C#支持\K转义序列,您可以使用?的贪婪来为您完成工作(demo here):

string1(?:optionalstring2)?\K\w+

然而,这(遗憾地)isn't the case。因此,您似乎无法使用捕获组:

string1(?:optionalstring2)?(\w+)