具有条件lookbehind和捕获组的.net正则表达式

uto*_*pia 6 .net regex

图案: a(?(?<! ) )b (c)

输入: a b c

Desription:条件应该与空间匹配,如果lookbehind不是空格.

它匹配正确,但捕获组$ 1为空(包含c的instad).

这是.net正则表达式的问题还是我错过了什么?

示例:http://regexstorm.net/tester?p = a(%3f(%3f%3C!+)+)b +(c)&i = a + b+c

rev*_*evo 4

我不确定此行为是否已记录(如果是,则我没有找到它),但使用包含显式零宽度断言的条件构造,因为其表达式(?(?=expression)yes|no)会覆盖下一个编号的捕获组(清空它)。您可以通过运行下面的正则表达式来确认这一点:

a(?(?<! ) )b (c)()
Run Code Online (Sandbox Code Playgroud)

解决这个问题的四种方法:

  1. 将表达式括在 @DmitryEgorov 指出的括号中(这也保持第二个捕获组完整)并且不包含在结果中 - 正确的方式:

    a(?((?<! )) )b (c)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 由于此行为仅适用于未命名的捕获组(默认),因此您可以使用命名的捕获组获得预期结果:

    a(?(?<! ) )b (?<first>c)
    
    Run Code Online (Sandbox Code Playgroud)
  3. (c)和 条件之间添加一个额外的捕获组:

    a(?(?<! ) )(b) (c)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 尽可能避免这样的表达。例如:

    a(?( ) )b (c)
    
    Run Code Online (Sandbox Code Playgroud)

  • 解决此问题的另一种方法是将条件包含在额外的捕获组中:`a(?((?&lt;! )) )b (c)` (2认同)