开发者

How do I limit the number of replacements when using gsub?

How do you limit the numbe开发者_开发问答r of replacements made by String#gsub in Ruby?

In PHP this can be easy done with preg_replace which takes a parameter for limiting replacements, but I can't figure out how to do this in Ruby.


You can create a counter and decrement that within a gsub loop.

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


gsub replaces all occurences.

You can try String#sub

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


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


You can use the str.split method, which takes a limit, with a join with the replacement:

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

This works when the replacement string would match the regex since the split is done prior to the replacement:

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

You can also use gsub with a block and count and ternary:

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

You can also use the regex index method with a .times loop:

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

But you can't use a replacement that matches the regex for this last one:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜