代码之家  ›  专栏  ›  技术社区  ›  Matheus Simon

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

  •  -1
  • Matheus Simon  · 技术社区  · 7 年前

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

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

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

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

    有什么想法吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   CertainPerformance    7 年前

    您可以使用:

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

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

    一般的想法是在(匹配@并继续,直到再次找到初始分隔符)和(匹配初始分隔符并继续,直到再次找到非转义分隔符)之间进行切换。

    分解:交替

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

    • ^(["'])(?:\\\2|(?!\\\2)(?!\2).)*\2
      • ^(["'])(?:
        • \\\2 逃脱 初始分隔符,或
        • (?!\\\2)(?!\2).
      • )*\2 重复上一组,直到再次到达初始分隔符

    由于在评论中对其进行了一些讨论,第二次交替中的大重复组 可以 )*?\2 而不是 ),这可能会减少某些字符串所需的步骤,但这不是必需的。