17

Ruby 的String#gsub方法是否提供了包含替换索引的方法?例如,给定以下字符串:

我喜欢你,你,你,还有你。

我想结束这个输出:

我喜欢你1、你2、你3和你4。

我知道我可以使用\1,\2等来匹配括号中的字符,但是有没有类似的东西\i可以\n提供当前匹配的数量?

值得一提的是,我的实际术语并不像“你”那么简单,因此假设搜索词是静态的替代方法是不够的。

4

3 回答 3

49

我们可以链接with_indexgsub()

foo = 'I like you, you, you, and you.'.gsub(/\byou\b/).with_index { |m, i| "#{m}#{1+i}" }
puts foo

输出:

I like you1, you2, you3, and you4.
于 2012-08-30T17:58:51.087 回答
3

这可行,但很丑:

n = 0; 
"I like you, you, you, and you.".gsub("you") { val = "you" + n.to_s; n+=1; val }
=> "I like you0, you1, you2, and you3."
于 2012-08-30T15:19:17.500 回答
3

这有点 hacky,但是您可以使用在传递给 gsub 的块内递增的变量

source = 'I like you, you, you, and you.'
counter = 1
result = source.gsub(/you/) do |match|
  res = "#{match}#{counter}"
  counter += 1
  res
end

puts result
#=> I like you1, you2, you3, and you4.
于 2012-08-30T15:19:35.990 回答