【问题标题】:Regex to match string not ending with pattern正则表达式匹配不以模式结尾的字符串
【发布时间】:2012-07-11 11:05:13
【问题描述】:

仅当字符串不以至少三个 '0' 或更多结尾时,我才会尝试查找与字符串匹配的正则表达式。直觉上,我试过了:

.*[^0]{3,}$

但是当字符串末尾有一个或两个零时,这不匹配。

【问题讨论】:

    标签: regex regex-negation


    【解决方案1】:

    如果您必须在没有后向断言的情况下执行此操作(即在 JavaScript 中):

    ^(?:.{0,2}|.*(?!000).{3})$
    

    否则,使用 hsz 的答案。

    说明:

    ^          # Start of string
    (?:        # Either match...
     .{0,2}    #  a string of up to two characters
    |          # or
     .*        #  any string
     (?!000)   #   (unless followed by three zeroes)
     .{3}      #  followed by three characters
    )          # End of alternation
    $          # End of string
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用否定的look-behind,即:

      (?<!000)$
      

      测试:

      Test  Target String   Matches
      1     654153640       Yes
      2     5646549800      Yes   
      3     848461158000    No
      4     84681840000     No
      5     35450008748     Yes   
      

      但请记住,并非所有语言都支持负面的后视。

      【讨论】:

      • 这并不适用于所有实现。例如,它不适用于 Javascript。你在做什么?
      • 当然,它需要测试。但是,此解决方案效果很好,并且可以使用 op 未指定的语言进行调整。
      • 您在哪个实现中尝试过?查看 OP 的个人资料,他/她似乎经常使用 bash,它不支持后视,所以这不起作用并且无法适应。
      • 如果你提到这是一个(否定的)lookbehind,通过查看他们的正则表达式环境是否支持这样的东西,这将使读者更容易避免白痴。
      • 这在 Visual Studio 2015 中有效 在文件中查找:"do_(\w+|[\w-[0-9]]\w*(?
      【解决方案3】:

      不向后看、更通用的^(.(?!.*0{3,}$))*$ 有什么问题?

      一般模式是^(.(?!.* + not-ending-with-pattern + $))*$。您不必像蒂姆的回答那样对状态机进行逆向工程;你只需在最后插入你不想匹配的模式。

      【讨论】:

        【解决方案4】:

        这是 RegEx 不太擅长的事情之一,因为字符串不是很常规(不管这意味着什么)。我能想出的唯一方法就是给它所有的可能性。

        .*[^0]..$|.*.[^0].$|.*..[^0]$
        

        简化为

        .*([^0]|[^0].|[^0]..)$
        

        如果您只想要不以三个 0 结尾的字符串,那很好,但不以十个 0 结尾的字符串会很长。但幸运的是,这个字符串比其中一些组合更正规,你可以进一步简化它。

        .*[^0].{0,2}$
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-23
          • 2021-01-17
          • 2016-03-26
          • 1970-01-01
          • 2015-08-01
          • 2015-09-28
          • 1970-01-01
          相关资源
          最近更新 更多