在其他语言中,你可以使用 /.../g
在正则表达式中进行全局匹配。
然而,在Ruby中:
"hello hello".match /(hello)/
只能捕捉一个“hello”。
如何捕捉所有的hello
?
"hello1 hello2".scan(/(hello\d+)/) # => [["hello1"], ["hello2"]]
"hello1 hello2".scan(/(hello\d+)/).each do|m|
puts m
end
我已经写过这种方法了,你可以在本文末尾的这里阅读相关内容。
以下是一个提示,适用于任何寻找一种方法将所有正则表达式匹配替换为其他字符的人。
Ruby不像许多其他语言一样使用//g标志和仅一个替换方法,而是使用两种不同的方法。
# .sub — Replace the first
"ABABA".sub(/B/, '') # AABA
# .gsub — Replace all
"ABABA".gsub(/B/, '') # AAA
使用String#scan
方法。它将返回每个匹配项的数组,或者您可以传递一个块并使用每个匹配项调用它。
所有详细信息请查看http://ruby-doc.org/core/classes/String.html#M000812
.scan(...){|m|...}
。 - Nakilon()
将给你一个常规的、扁平的数组。如果你至少指定了1个子组,你将得到一个嵌套的数组(其子数组不包括整个匹配 - 只有子组捕获)。 - mklement0