说输入为String1OptionalString2WhatWeWant
另一种输入是String1WhatWeWant
所以我希望匹配WhatWeWant
部分,第一部分应该转到前缀。
但是我似乎无法得到这个结果。
跟着正则表达式没有产生预期的效果
(?<=string1optionalstring2|string1)\w+
它仍然匹配optionalstring2而我不知道那是什么。 我认为它更喜欢左全匹配..
答案 0 :(得分:1)
我认为String1
始终存在?然后:
(?:String1)(?:OptionalString2)?\w+
答案 1 :(得分:0)
发生了什么
要理解为什么外观以一种看似不连贯的方式表现,请记住正则表达式引擎从左向右移动并返回它找到的第一个匹配。
让我们看看在(?<=ab|a)\w+
上匹配abc
所需的步骤:
a
开始。之前没有任何事情,所以后视失败b
ab
)失败a
)匹配\w+
匹配字符串的其余部分因此整体匹配为bc
,并且正则表达式引擎在此过程中没有破坏其任何规则。
如何修复
如果C#支持\K
转义序列,您可以使用?
的贪婪来为您完成工作(demo here):
string1(?:optionalstring2)?\K\w+
然而,这(遗憾地)isn't the case。因此,您似乎无法使用捕获组:
string1(?:optionalstring2)?(\w+)