如何在Ruby中替换所有匹配的模式?

41

string.sub 看起来只替换第一个匹配项。是否有此选项或其他可以替换所有模式的方法?您能否在正则表达式中像Perl一样做到这一点?

(我认为类似 r/blah/blah/ 的东西)

... 任何人能告诉我为什么 string.sub 只替换第一个匹配项吗?+1。


2
同样的原因,Perl 需要 g 修饰符来使替换全局化。替换全部通常是您想要的,但并不总是如此。 - Telemachus
2个回答

81

String.gsub 可以解决问题。

引用文档:

gsub(pattern, replacement) → new_str

返回 str 的一个副本,其中所有匹配 pattern 的子串都被第二个参数替换。pattern 通常是一个 Regexp;如果给定为 String,则会将其包含的任何正则表达式元字符解释为字面意义,例如 \\d 将匹配反斜杠后跟着的 d,而不是一个数字。


4
w00t。谢谢。你会认为该子程序默认执行此操作,然后具有一个int参数以替换前N个出现次数! - aarona
5
DJ: 不,你不会这样做。如果你想要替换第一个匹配项,那么用 SUBstitute 命令就可以了,如果想要替换所有匹配项,就要用 Global SUBstitute 命令。 - Robert K
进一步参考,请查看手册页面 - Aurélien Bénel

8

我可以解释为什么sub只替换模式的第一个匹配项,但我认为文档做得更好(来自命令行上的ri String#sub):

str.sub(pattern, replacement)         => new_str
str.sub(pattern) {|match| block }     => new_str

Returns a copy of _str_ with the _first_ occurrence of _pattern_
replaced with either _replacement_ or the value of the block.

5
哇,我已经使用 Ruby 和 Rails 几年了。今天是因为你的帖子,我第一次打出 "ri something#method"。我不知道那个功能存在!以前一直是通过谷歌搜索术语并找到文档的方式获取信息。 - Andrew Arrow

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