7

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

在 PHP 中,这可以通过 preg_replace 轻松完成,它接受一个参数来限制替换,但我不知道如何在 Ruby 中做到这一点。

4

4 回答 4

5

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

str = 'aaaaaaaaaa'
count = 5
p str.gsub(/a/){if count.zero? then $& else count -= 1; 'x' end}
# => "xxxxxaaaaa"
于 2011-05-15T20:20:17.997 回答
3

gsub 替换所有出现。

你可以试试 String#sub

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

于 2011-05-15T16:39:46.787 回答
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
于 2011-05-16T00:12:01.613 回答
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"
于 2021-07-25T13:55:52.973 回答