为什么这个正则表达式不排除零宽度正向后观断言中的这些表达式?

时间:2015-08-07 16:20:43

标签: c# regex

我的正则表达式是

(?<=signed( out)?( by)?( resident)?( by resident)?( out by)?)[:]? \S+

我的示例字符串是

1) ***Signed Out***      name name n,
2) signed by resident: name 
3) signed by:name name
4) Signed Out By name, name p.

自从我使用以来我一直在期待?&lt; =该组中的所有内容都不匹配,但我发现匹配中包含了一些子表达式

例如,为每个字符串排除的部分只是字符串'signed'但是我还希望从匹配中排除'out','by resident''by'或'out by'如果它们发生字符串签名后。

2 个答案:

答案 0 :(得分:1)

为什么不忘记lookbehinds而是使用匹配的组只为你想要的部分(最后的名称)。请参阅regex101上的此示例:

[*]*signed(?: out)?(?: by)?(?: resident)?[*]*:? *(.*)

除了从外观到非捕捉组的变化之外,以下是我所做的其他更正:

  • 看起来你需要允许使用星号
  • 冒号后可能有0到多个空格
  • 全名不能与\S+匹配,因为它可能包含空格和逗号

答案 1 :(得分:0)

如下所示更改正则表达式。

(?<=signed(?:(?: out)?(?: by)?|by resident)?[:]?\s*)\w+