Ruby 全局匹配正则表达式?

59

在其他语言中,你可以使用 /.../g 在正则表达式中进行全局匹配。

然而,在Ruby中:

"hello hello".match /(hello)/

只能捕捉一个“hello”。

如何捕捉所有的hello

3个回答

77
你可以使用scan方法。scan方法可以为您提供所有匹配项的数组,或者如果您传递一个块,则将每个匹配项传递给该块。
"hello1 hello2".scan(/(hello\d+)/)   # => [["hello1"], ["hello2"]]

"hello1 hello2".scan(/(hello\d+)/).each do|m|
  puts m
end

我已经写过这种方法了,你可以在本文末尾的这里阅读相关内容。


8
不需要逐个执行。只需使用.scan(...){|m|...} - Nakilon
4
好的,一个额外的提示:如果你的正则表达式只需要捕获整个匹配(没有子组),省略括号()将给你一个常规的、扁平的数组。如果你至少指定了1个子组,你将得到一个嵌套的数组(其子数组不包括整个匹配 - 只有子组捕获)。 - mklement0

15

以下是一个提示,适用于任何寻找一种方法将所有正则表达式匹配替换为其他字符的人。

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

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

# .gsub — Replace all
"ABABA".gsub(/B/, '') # AAA

12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接