【问题标题】:Does Ruby regular expression have a not match operator like "!~" in Perl?Ruby 正则表达式在 Perl 中是否有像“!~”这样的不匹配运算符?
【发布时间】:2012-11-25 09:29:32
【问题描述】:

我只想知道 ruby​​ 正则表达式是否有不匹配运算符,就像 perl 中的!~。我觉得使用 (?!xxx)(?<!xxxx) 很不方便,因为您不能在 xxx 部分使用正则表达式模式。

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    是的:!~ 工作得很好——你可能认为它不会因为it’s missing from the documentation page of Regexp。尽管如此,它仍然有效:

    irb(main):001:0> 'x' !~ /x/
    => false
    irb(main):002:0> 'x' !~ /y/
    => true
    

    【讨论】:

    • !~ 记录在 Object 下。
    • 对于 ruby​​ 2.4,还有更好的语法RegExp#match?,您可以轻松地否定它。根据release notes,它比!~进行的分配更少
    【解决方案2】:

    支持 AFAIK (?!xxx):

    2.1.5 :021 > 'abc1234' =~ /^abc/
     => 0
    2.1.5 :022 > 'def1234' =~ /^abc/
     => nil
    2.1.5 :023 > 'abc1234' =~ /^(?!abc)/
     => nil
    2.1.5 :024 > 'def1234' =~ /^(?!abc)/
     => 0
    

    【讨论】:

    • 这是一个较低级别的解决方案。以这种方式转换正则表达式并不总是那么容易。另一方面,这个解决方案不依赖于顶级编程语言;)
    【解决方案3】:

    回到 perl,'foobar' !~ /bar/ 非常适合测试字符串不包含“bar”。

    在 Ruby 中,尤其是现代风格指南,我认为更明确的解决方案更传统且易于理解:

    input = 'foobar'
    
    do_something unless input.match?(/bar/) 
    
    needs_bar = !input.match?(/bar/)
    

    也就是说,我认为如果有一个.no_match? 方法会很漂亮。

    【讨论】:

      猜你喜欢
      • 2021-02-21
      • 2012-03-09
      • 1970-01-01
      • 2014-05-06
      • 2016-06-29
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多