Regex 仅当找到捕获组时应用正向前瞻
我正在尝试创建一个与字符串匹配的正则表达式(用C#)。这是我要做的测试:Regex 仅当找到捕获组时应用正向前瞻,regex,lookahead,Regex,Lookahead,我正在尝试创建一个与字符串匹配的正则表达式(用C#)。这是我要做的测试: "bla\"" => matches "bla\"" "bla\" => no matches @"bla\" => matches @"bla\" @"bla\"" => matches only @"bla\" 也就是说,如果引号前面有@符号,则正则表达式将忽略控制字符(\) 到目前为止,我的正则表达式是这样的: ^@?(["'])(?:(?=(\\?))\2.)+?\1$ 我唯一的问题是
"bla\"" => matches "bla\""
"bla\" => no matches
@"bla\" => matches @"bla\"
@"bla\"" => matches only @"bla\"
也就是说,如果引号前面有@符号,则正则表达式将忽略控制字符(\)
到目前为止,我的正则表达式是这样的:
^@?(["'])(?:(?=(\\?))\2.)+?\1$
我唯一的问题是识别@并处理控制字符
有什么想法吗?您可以使用:
^@(["']).*?\1|^(["'])(?:\\\2|(?!\\\2)(?!\2).)*\2
一般的想法是在(匹配@并继续,直到再次找到初始分隔符)和(匹配初始分隔符并继续,直到再次找到非转义分隔符)之间进行交替
分解:在
-匹配^@([“')).\1
和初始分隔符,延迟重复,直到再次找到初始分隔符@
:^([“')(?:\\\2(?!\\\2)(?!\2)。*\2
-匹配初始分隔符,然后匹配一组:^([“'))(?:
-转义的初始分隔符,或\\\2
-不是转义初始分隔符开头的任何字符,也不是非转义分隔符的任何字符(?!\\\2)(?!\2)。
重复上一组,直到再次到达初始分隔符)*\2
由于在评论中对其进行了一些讨论,第二个备选方案中的大重复组可以随意重复(以
结尾)*?\2
而不是)*\2
),这可能会减少某些字符串所需的步骤,但不是必需的。字符串中是否还有其他反斜杠,除了转义'
或“
分隔符的反斜杠?所有反斜杠都形成一个控制对,但唯一重要的是那些与起始引用匹配的测试用例。不清楚这些测试用例是期望的匹配还是您当前的输出。请澄清。我希望它现在更清楚,如果没有,请告诉我。@“bla\”=>只匹配@“bla\”
,但您的正则表达式匹配整个。它不应该匹配“bla”
。实际上,它应该能够匹配”
好的,请参阅编辑-添加负前瞻以获取初始分隔符EAH,我在最后添加的惰性操作符完成了这项工作!请添加它以便我可以标记答案:^@([“')).?\1 | ^([“'))(?:\\\2 |(?!\\\2)。*?\2
我很好奇,懒惰重复是为了什么样的字符串?我本以为之前小组中的(?!\2)
已经足够了,那么为什么你在知道原因之前就编辑了答案?