Regex 仅当找到捕获组时应用正向前瞻

Regex 仅当找到捕获组时应用正向前瞻,regex,lookahead,Regex,Lookahead,我正在尝试创建一个与字符串匹配的正则表达式(用C#)。这是我要做的测试: "bla\"" => matches "bla\"" "bla\" => no matches @"bla\" => matches @"bla\" @"bla\"" => matches only @"bla\" 也就是说,如果引号前面有@符号,则正则表达式将忽略控制字符(\) 到目前为止,我的正则表达式是这样的: ^@?(["'])(?:(?=(\\?))\2.)+?\1$ 我唯一的问题是

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

"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)
已经足够了,那么为什么你在知道原因之前就编辑了答案?