仅在找到捕获组时应用正向先行
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=结尾) ] 而不是 )*
) ,这可能会减少某些字符串所需的步骤,但这不是必需的。
我正在尝试创建一个匹配字符串的正则表达式(在 C# 中)。这是我要进行的测试:
"bla\"" => matches "bla\""
"bla\" => no matches
@"bla\" => matches @"bla\"
@"bla\"" => matches only @"bla\"
也就是说,如果 @ 符号在引号之前,则正则表达式会忽略控制字符 (\)。
到目前为止我的正则表达式是这样的:
^@?(["'])(?:(?=(\?)).)+?$
我唯一的问题是识别@和处理控制字符...
有什么想法吗?
您可以使用:
^@(["']).*?|^(["'])(?:\|(?!\)(?!).)*
https://regex101.com/r/BvcLJB/3
总体思路是在(匹配 @ 并继续直到再次找到初始定界符)和(匹配初始定界符并继续直到再次找到非转义定界符)之间交替。
分解:交替
^@(["']).*?
- 匹配@
和初始分隔符,延迟重复直到再次找到初始分隔符
和
^(["'])(?:\|(?!\)(?!).)*
:^(["'])(?:
- 匹配初始分隔符,然后是一组:\
- 转义 初始分隔符,或(?!\)(?!).
- 不是转义初始定界符开头的任何字符,也不是非转义定界符的任何字符
)*
重复上一组,直到再次到达初始分隔符
由于评论里有一些讨论,所以第二次交替的大重复组可以懒惰重复(以[=18=结尾) ] 而不是 )*
) ,这可能会减少某些字符串所需的步骤,但这不是必需的。