替换n个字母的第一次出现

时间:2015-06-29 22:00:06

标签: ruby regex string replace

我想修改红宝石字符串中第一个出现的字母。

例如:

> "abcabcabcabc".some_magic_method("a", "0", 3)
=> "0bc0bc0bcabc"

我很确定我错过了什么,但我找不到简单的方法!也许正在使用正则表达式?

4 个答案:

答案 0 :(得分:8)

您可以使用基本的分组/连接方法:

"abcabcabcabc".split('a', 4).join('0')

请注意,拆分限制必须为:替换次数+ 1

答案 1 :(得分:2)

我的第一个想法是:

3.times.inject("abcabcabcabc") { |str, _| str.sub!('a','0') }

但我更喜欢Casimir的答案,特别是因为此解决方案仅为O(mn)

答案 2 :(得分:1)

这是另一种单程方法:

class String
  def some_magic_method(c_before, c_after, ntimes)
    gsub(/#{c_before}/) { ntimes -= 1; (ntimes>=0) ? c_after : c_before }
  end
end

"abcabcabcabc".some_magic_method('a', '0', 3)
  #=> "0bc0bc0bcabc"

"abcabcabcabc".some_magic_method('ab', 'xyz', 2)
  #=> "xyzcxyzcabcabc" 

答案 3 :(得分:0)

我做的很简单:

str = "abcabcabcabc"
3.times { str.sub!("a", "0") }
str # => "0bc0bc0bcabc"

如果你有方法:

class String
  def some_magic_method(n, target, replacement)
    n.times { self.sub!(target, replacement) }
    self
  end
end

str = "abcabcabcabc"
str.some_magic_method(3, 'a', '0') # => "0bc0bc0bcabc"