【问题标题】:Regex lookahead or lookbehind expressions正则表达式前瞻或后视表达式
【发布时间】:2014-05-22 10:19:15
【问题描述】:

如果是字符串,我必须在单个正则表达式中检查

  1. 包含 substring-1
  2. 不包含 substring-2

不管两个子串的位置。

  1. substring-2 bla bla bla substring-1”:不匹配
  2. "substring-1 bla bla bla substring-2": 不匹配
  3. substring-2 bla bla bla substring-1 bla bla substring-2”:不匹配
  4. “bla bla bla substring-1 bla bla”:匹配

我一直在尝试使用 lookaorund 表达式,但无法检查 substring-2 是在 substring-1 之后还是之前。

(?<!substring-2.*)(?!.*substring-2)substring-1

如果 substring-2 不在 substring-1 之前和之后,则此表达式将适合我的情况。因此,如果 substring-2 出现在正则表达式之前和之后都可以工作,但如果只出现在之后或之前将不起作用。

如何将其转换为 OR 条件,以便将 lookaorund 表达式组合成 OR?

注意:输入字符串将是多行的,因此它可以包含换行符。

注意:正则表达式必须与 .NET 兼容

【问题讨论】:

  • 是否需要检查整个字符串是否符合您的要求,或者实际检索substring-1
  • 我需要取回 substring-1
  • 输入字符串将是多行的:您需要在每一行还是整个字符串上检查substring-2
  • substring-2 不应位于整个多行字符串中的任何位置。

标签: .net regex regex-lookarounds


【解决方案1】:

您可以在字符串的开头进行检查,然后将substring-1存储在第一个捕获组中:

(?s)^(?!.*substring-2).*(substring-1)

(?s) 只是打开dot matches all(甚至换行符)标志的内联方式。

【讨论】:

    【解决方案2】:

    您可以只使用 一个 否定前瞻 - demo

    ^(?!.*substring-2).*substring-1
    

    【讨论】:

      【解决方案3】:

      实现这一点的一般技术是将“规则”与前瞻连接起来:

      ^(?=.*substring-1)(?!.*substring-2)

      如果你想让substring-3 失败。然后添加另一个前瞻:

      ^(?=.*substring-1)(?!.*substring-2)(?!.*substring-3)

      不要忘记 s 修饰符来匹配换行符和点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-13
        • 2014-07-05
        • 1970-01-01
        • 2013-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-11
        相关资源
        最近更新 更多