如何限制Ruby中String#gsub所做的替换次数?
在PHP中,这可以通过preg_replace轻松完成,它使用参数来限制替换,但我无法弄清楚如何在Ruby中执行此操作。
答案 0 :(得分:4)
你可以在gsub循环中创建一个计数器并减少它。
str = 'aaaaaaaaaa'
count = 5
p str.gsub(/a/){if count.zero? then $& else count -= 1; 'x' end}
# => "xxxxxaaaaa"
答案 1 :(得分:3)
答案 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"