如何限制 Ruby 中 String#gsub 的替换次数?
在 PHP 中,这可以通过 preg_replace 轻松完成,它接受一个参数来限制替换,但我不知道如何在 Ruby 中做到这一点。
您可以在 gsub 循环中创建一个计数器并减少它。
str = 'aaaaaaaaaa'
count = 5
p str.gsub(/a/){if count.zero? then $& else count -= 1; 'x' end}
# => "xxxxxaaaaa"
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
您可以使用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"