2012-08-30 7 views
14

RubyのString#gsubメソッドは、置換のインデックスを含める手段を提供していますか?たとえば、次の文字列を指定します。インデックス/オフセット付きRuby gsub?

私はあなた、あなた、あなた、そしてあなたが好きです。

私は、この出力で終わるしたい:

私はyou1、you2、you3、およびyou4が好き。

私は、括弧内の文字を照合するため\1\2などを使用することができます知っているが、現在のマッチの数を提供する\iまたは\nようなものはありますか?

私の実際の言葉は "あなた"ほど単純ではないことに言及する価値があるので、検索語が静的であると仮定する別のアプローチでは十分ではありません。

+0

''あなたが ''と仮定したコード例は、必要なターゲットや正規表現をその場所で置き換えるように簡単に修正されています。 –

答えて

35

チェーンに渡されたブロックの内部でインクリメント変数を使用することができます

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

を出力する:取得するgsub()からwith_index

I like you1, you2, you3, and you4. 
+1

本当に素敵です。 +1 – apneadiving

+2

'each_with_index'と' with_index'の両方は、ヒットしていないヒーローです。 –

+0

私は最新のものを無視したことを認めます! – apneadiving

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." 
+0

置換文字列に\ 1などの値が含まれているとどうなりますか?一致した文字列の$ 1を正しく置き換えるにはどうしたらいいですか?例:「hello」.gsub(/(ello)/、「iとh \ 1」)は「hiとhello」を生成します。ブロック内でこれらの置換をどのように考慮に入れることができますか? –

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. 
+1

同じ(醜い!)答え、同じ時刻=> +1: – apneadiving

+0

置換文字列に '\ 1'のような値が含まれているとどうなりますか?一致した文字列の '$ 1 'を正しく置き換えるにはどうすればいいですか? '' hello ".gsub(/(ello)/、" i and h \ 1 ")'は "hiとhello"を生成します。ブロック内でこれらの置換をどのように考慮に入れることができますか? –

+0

@MattHuggins:ブロックは各グループに対して呼び出されます。 '' iとh#{match} ''を使用すると、あなたが探しているものが得られるでしょう。 –