【问题标题】:Ruby global match regexp?Ruby全局匹配正则表达式?
【发布时间】:2011-04-05 01:45:56
【问题描述】:

在其他语言中,您可以在 RegExp 中使用 /.../g 进行全局匹配。

但是,在 Ruby 中:

"hello hello".match /(hello)/

只捕获一个 hello。

如何捕获所有hellos?

【问题讨论】:

    标签: ruby regex


    【解决方案1】:

    使用String#scan。它将返回每个匹配的数组,或者您可以传递一个块,它将在每个匹配时调用。

    http://ruby-doc.org/core/classes/String.html#M000812的所有详细信息

    【讨论】:

      【解决方案2】:

      您可以使用扫描方法。 scan 方法将给你一个包含所有匹配项的数组,或者,如果你将一个块传递给它,则将每个匹配项传递给块。

      "hello1 hello2".scan(/(hello\d+)/)   # => [["hello1"], ["hello2"]]
      
      "hello1 hello2".scan(/(hello\d+)/).each do|m|
        puts m
      end
      

      我已经写过这个方法,你可以在文章末尾附近阅读here

      【讨论】:

      • 不需要each。只需.scan(...){|m|...}
      • 太棒了;一个额外的指针:如果您的正则表达式只需要作为一个整体(没有子组)被捕获,那么省略封闭的 () 将为您提供一个常规的平面数组。如果您指定至少 1 个子组,您将获得一个嵌套数组(其子数组不包括整个匹配项 - 只有子组捕获)。
      【解决方案3】:

      对于任何想用其他方法替换所有正则表达式匹配的人来说,这是一个提示。

      Ruby 不像许多其他语言那样使用 //g 标志和一种替换方法,而是使用两种不同的方法。

      # .sub — Replace the first
      "ABABA".sub(/B/, '') # AABA
      
      # .gsub — Replace all
      "ABABA".gsub(/B/, '') # AAA
      

      【讨论】:

        猜你喜欢
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-15
        • 1970-01-01
        相关资源
        最近更新 更多