【问题标题】:Regex negative match query正则表达式否定匹配查询
【发布时间】:2011-01-31 18:12:38
【问题描述】:

我遇到了一个正则表达式问题,我试图忽略数字“41”,我希望 4、1、14 等都匹配。

我得到了这个[^\b41\b],这实际上是我想要的,但这也忽略了值 1 和 4 的所有单次迭代。

例如,这匹配“41”,但我希望它不匹配: \b41\b

【问题讨论】:

    标签: regex regex-negation


    【解决方案1】:

    这类似于问题“Regular expression that doesn’t contain certain string”,所以我将从那里重复我的答案:

    ^((?!41).)*$
    

    这将适用于任意字符串,而不仅仅是 41。有关说明,请参阅 my response there

    【讨论】:

      【解决方案2】:

      您可以使用否定的look-ahead assertion 来排除41

      /\b(?!41\b)\d+\b/
      

      这个正则表达式被解释为:在任何字边界\b,如果它后面没有41\b(?!41\b)),匹配一个或多个数字后跟一个字边界。

      或与否定look-behind assertion相同:

      /\b\d+\b(?<!\b41)/
      

      这个正则表达式被解释为:匹配一个或多个被单词边界包围的数字,但前提是匹配末尾的子字符串前面没有\b41 ((?&lt;!\b41))。

      甚至可以只使用基本语法:

      /\b(\d|[0-35-9]\d|\d[02-9]|\d{3,})\b/
      

      这仅匹配由以下任一单词边界包围的数字序列:

      • 一位数
      • 第一个位置没有4 或第二个位置没有1 的两个数字
      • 三位或更多位数

      【讨论】:

        【解决方案3】:

        尝试类似:

        \b(?!41\b)(\d+)
        

        (?!...) 构造是 negative lookahead,因此这意味着:找到一个 后跟“41”的单词边界,并捕获其后的数字序列。

        【讨论】:

          猜你喜欢
          • 2021-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 2017-06-18
          • 2012-12-16
          相关资源
          最近更新 更多