【发布时间】:2011-04-05 01:45:56
【问题描述】:
在其他语言中,您可以在 RegExp 中使用 /.../g 进行全局匹配。
但是,在 Ruby 中:
"hello hello".match /(hello)/
只捕获一个 hello。
如何捕获所有hellos?
【问题讨论】:
在其他语言中,您可以在 RegExp 中使用 /.../g 进行全局匹配。
但是,在 Ruby 中:
"hello hello".match /(hello)/
只捕获一个 hello。
如何捕获所有hellos?
【问题讨论】:
使用String#scan。它将返回每个匹配的数组,或者您可以传递一个块,它将在每个匹配时调用。
【讨论】:
您可以使用扫描方法。 scan 方法将给你一个包含所有匹配项的数组,或者,如果你将一个块传递给它,则将每个匹配项传递给块。
"hello1 hello2".scan(/(hello\d+)/) # => [["hello1"], ["hello2"]]
"hello1 hello2".scan(/(hello\d+)/).each do|m|
puts m
end
我已经写过这个方法,你可以在文章末尾附近阅读here。
【讨论】:
each。只需.scan(...){|m|...}
() 将为您提供一个常规的平面数组。如果您指定至少 1 个子组,您将获得一个嵌套数组(其子数组不包括整个匹配项 - 只有子组捕获)。
对于任何想用其他方法替换所有正则表达式匹配的人来说,这是一个提示。
Ruby 不像许多其他语言那样使用 //g 标志和一种替换方法,而是使用两种不同的方法。
# .sub — Replace the first
"ABABA".sub(/B/, '') # AABA
# .gsub — Replace all
"ABABA".gsub(/B/, '') # AAA
【讨论】: