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

これは少しハックですが、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 に答える
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 に答える