【问题标题】:How can I replace every instance of a pattern in ruby?如何替换 ruby​​ 中模式的每个实例?
【发布时间】:2010-12-26 02:26:52
【问题描述】:

string.sub 看起来它只替换了第一个实例。是否有可以替换所有模式的选项或其他方法?你能在像 perl 这样的正则表达式中做到这一点吗?

(我认为类似 r/blah/blah/)

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

【问题讨论】:

  • 出于同样的原因,Perl 需要一个 g 修饰符来进行全局替换。替换所有通常是您想要的,但并非总是如此。

标签: ruby regex string replace


【解决方案1】:

String.gsub 应该可以解决问题。

引用文档:

gsub(pattern, replacement) → new_str

返回 str 的副本,其中 all 出现模式 代替第二个参数。该模式通常是 正则表达式;如果作为字符串给出,则任何正则表达式都会对其进行元字符 contains 将按字面意思解释,例如\\d 将匹配一个 后跟d,而不是数字。

【讨论】:

  • w00t。谢谢。你会认为 sub 会默认这样做,然后有一个 int 参数来替换前 N 次出现!
  • DJ:不,你不会。如果要替换第一个匹配项,则 SUBstitute 是您的选择,如果不是 Global SUBstitute 是您的选择。
  • 更多参考,这里是manual page
【解决方案2】:

我可以解释为什么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.

【讨论】:

  • 哇,我已经使用 ruby​​ 和 rails 多年了。今天是我第一次输入 ri something#method 因为你的帖子。我不知道有这个功能!只是在谷歌上搜索条款并以这种方式找到文档。
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 2021-12-28
  • 2011-09-02
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
相关资源
最近更新 更多