【问题标题】:Variable-length lookbehind for backslashes反斜杠的可变长度后视
【发布时间】:2021-08-17 11:55:06
【问题描述】:

看似简单的任务最终没有按预期工作......

我正在尝试匹配 \$\w+\b,除非它前面有奇数个反斜杠。

示例(只有 $result 应该在匹配项中):

This $result should be matched

This \$result should <strong>not</strong> be matched

This \\$result should be matched

This \\\$result should <strong>not</strong> be matched

等等……

以下模式有效:

(?<!\\)(\\\\)*\$\w+\b

但是,即使是重复的反斜杠也包含在匹配中,这是不需要的,所以我试图通过可变长度的后视来实现这一点,但到目前为止我尝试的任何方法似乎都不起作用。

这里有任何正则表达式大师可以帮忙吗?

【问题讨论】:

    标签: c# .net regex regex-lookarounds


    【解决方案1】:

    您可以使用以下模式:

    (?<!(?:^|[^\\])\\(?:\\\\)*)\$\w+\b
    

    Demo.

    Lookbehind 的故障;即,前面没有:

    • (?:^|[^\\]) - 字符串/行的开头或反斜杠以外的任何字符。
    • \\ - 然后是一个反斜杠字符。
    • (?:\\\\)* 然后,任意偶数个反斜杠字符(包括零)。

    【讨论】:

      【解决方案2】:

      看起来问这个问题帮助我回答了我自己的问题。

      我不想匹配的部分必须用正面后向包装。

      <strong>(?&lt;=</strong>(?&lt;!\\)(\\\\)*<strong>)</strong>\$\w+\b

      如果 $result 位于行首,也可以使用。

      如果有人有更优化的解决方案,那就开枪吧!

      【讨论】:

      • 请注意,您仍然可以使用 nagative Lookbehind。一种变体是我上面的答案中显示的变体。或者您可以使用嵌套的 Lookbehinds(就像您在此处所做的那样):(?&lt;!(?&lt;!\\)\\(?:\\\\)*)\$\w+\b.
      【解决方案3】:

      这个正则表达式在第三个捕获组中获取想要的文本: (^| )(\\\\)*(\$\w+\b)

      解释:

      (^| )          Either beginning of line or a space
      (\\\\)*        An even number of backslash characters, including none
      (              Start of capture group 3
          \$\w+\b    The wanted text
      )              End of capture group 3
      

      【讨论】:

      • 我在问题中提到的例子也可以,这根本不是问题,问题是如何在比赛中没有任何额外内容的情况下做到这一点,这是我自己解决的答案和 41686d6564 的答案。不过还是谢谢你的回复。
      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多