Ruby全局匹配regexp?

nev*_*ame 51 ruby regex

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

但是,在Ruby中:

"hello hello".match /(hello)/
Run Code Online (Sandbox Code Playgroud)

只捕获一个你好

我如何捕获所有你好?

Abo*_*uby 68

您可以使用扫描方法.scan方法将为您提供所有匹配的数组,或者如果您传递一个块,则将每个匹配传递给该块.

"hello1 hello2".scan(/(hello\d+)/)   # => [["hello1"], ["hello2"]]

"hello1 hello2".scan(/(hello\d+)/).each do|m|
  puts m
end
Run Code Online (Sandbox Code Playgroud)

我已经写了这个方法,你可以看到它在这里附近的文章的末尾.

  • 不需要做'每个'.只是`.scan(...){| m | ...}` (7认同)
  • 大; 一个额外的指针:如果你的正则表达式只需要作为一个整体捕获(没有子组),省略封闭的`()`会给你一个规则的平面数组.如果指定至少1个子组,则会得到一个嵌套数组(其子数组不包含整个匹配 - 只有子组捕获). (3认同)

wup*_*tah 12

String#scan.它将返回每个匹配的数组,或者您可以传递一个块,并且每次匹配都会调用它.

有关详细信息,请访问http://ruby-doc.org/core/classes/String.html#M000812


iva*_*ese 8

以下是寻找替换所有正则表达式匹配的方法的人的提示.

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

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

# .gsub — Replace all
"ABABA".gsub(/B/, '') # AAA
Run Code Online (Sandbox Code Playgroud)