仅在找到捕获组时应用正向先行

Apply Positive Lookahead only if Capturing Group was found

我正在尝试创建一个匹配字符串的正则表达式(在 C# 中)。这是我要进行的测试:

"bla\"" => matches "bla\""
"bla\" => no matches
@"bla\" => matches @"bla\" 
@"bla\"" => matches only @"bla\"

也就是说,如果 @ 符号在引号之前,则正则表达式会忽略控制字符 (\)。

到目前为止我的正则表达式是这样的:

^@?(["'])(?:(?=(\?)).)+?$

我唯一的问题是识别@和处理控制字符...

有什么想法吗?

您可以使用:

^@(["']).*?|^(["'])(?:\|(?!\)(?!).)*

https://regex101.com/r/BvcLJB/3

总体思路是在(匹配 @ 并继续直到再次找到初始定界符)和(匹配初始定界符并继续直到再次找到非转义定界符)之间交替。

分解:交替

  • ^@(["']).*? - 匹配 @ 和初始分隔符,延迟重复直到再次找到初始分隔符

  • ^(["'])(?:\|(?!\)(?!).)*:
    • ^(["'])(?: - 匹配初始分隔符,然后是一组:
      • \ - 转义 初始分隔符,或
      • (?!\)(?!). - 不是转义初始定界符开头的任何字符,也不是非转义定界符的任何字符
    • )*重复上一组,直到再次到达初始分隔符

由于评论里有一些讨论,所以第二次交替的大重复组可以懒惰重复(以[=18=结尾) ] 而不是 )*) ,这可能会减少某些字符串所需的步骤,但这不是必需的。