仅在找到捕获组时才应用正向前瞻

时间:2018-10-14 21:06:50

标签: regex lookahead

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

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

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

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用:

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

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

通常的想法是在(匹配@并继续直到再次找到初始定界符)与(匹配初始定界符并继续直到再次找到非转义定界符)之间交替。

打破现状:交替出现

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

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

由于评论中对此进行了一些讨论,因此如果希望(以)*?\2而不是{{结尾, 1}}),可以减少某些字符串所需的步骤,但这不是必需的。