我正在尝试创建一个与字符串(在C#中)匹配的正则表达式。这是我要进行的测试:
"bla\"" => matches "bla\""
"bla\" => no matches
@"bla\" => matches @"bla\"
@"bla\"" => matches only @"bla\"
也就是说,如果@符号在引号之前,则正则表达式将忽略控制字符(\)。
到目前为止,我的正则表达式是这样的:
^@?(["'])(?:(?=(\\?))\2.)+?\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}}),可以减少某些字符串所需的步骤,但这不是必需的。