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

本文关键字:断言 表达式 正则表达式 排除 为什么 | 更新日期: 2023-09-27 18:06:57

我的正则表达式是

(?<=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.

由于我使用了?<=,所以我期望该组中的所有内容都不会匹配,但是我发现一些子表达式包含在匹配

中。

例如,对于每个字符串排除的部分只是字符串'signed',但是我也想从匹配中排除'out', 'by resident' 'by'或'out by',如果它们出现在字符串signed之后。

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

为什么不忘记后面的内容,而是为您想要的部分(末尾的名称)使用匹配组呢?参见regex101的示例:

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

除了从lookbehind到非捕获组的更改之外,以下是我所做的其他更正:

  • 看起来你需要允许星号
  • 冒号后面可以有0到多个空格
  • 全名不能被'S+匹配,因为它可能有空格和逗号

像下面这样修改你的正则表达式。

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