使用gsub时如何限制替换次数?

时间:2011-05-15 16:20:36

标签: ruby gsub

如何限制Ruby中String#gsub所做的替换次数?

在PHP中,这可以通过preg_replace轻松完成,它使用参数来限制替换,但我无法弄清楚如何在Ruby中执行此操作。

4 个答案:

答案 0 :(得分:4)

你可以在gsub循环中创建一个计数器并减少它。

str = 'aaaaaaaaaa'
count = 5
p str.gsub(/a/){if count.zero? then $& else count -= 1; 'x' end}
# => "xxxxxaaaaa"

答案 1 :(得分:3)

gsub替换所有出现的内容。

您可以尝试String#sub

http://ruby-doc.org/core/classes/String.html#M001185

答案 2 :(得分:3)

str = 'aaaaaaaaaa'
# The following is so that the variable new_string exists in this scope, 
# not just within the block
new_string = str 
5.times do 
  new_string = new_string.sub('a', 'x')
end

答案 3 :(得分:0)

您可以使用 str.split 方法,它带有一个限制,并带有一个带有替换的 join

str = 'aaaaaaaaaa'
n=5
puts str.split(/a/,n+1).join("e")
# eeeeeaaaaa

这在替换字符串与正则表达式匹配时有效,因为拆分是在替换之前完成的:

# use +1 more than desired replacements...
'aaaaaaaaaa'.split(/a/,6).join(' cat ')
" cat  cat  cat  cat  cat aaaaa"

您还可以将 gsub 与块和计数以及三元一起使用:

n=4  
'aaaaaaaaaa'.gsub(/a/){|m| (n-=1) >= 0 ? " cat " : m}
" cat  cat  cat  cat aaaaaa"

您还可以在 .times 循环中使用正则表达式索引方法:

5.times{str[/a/]='e'}
"eeeeeaaaaa"

但是您不能使用与正则表达式匹配的替换:

5.times{str[/a/]=" cat "}
# " c c c c cat t t t t aaaaaaaaa"