2012-04-07 9 views
2

Rubyでは、正確にn回、部分文字列をランダムに置き換えることはできますか?ランダムなgsub文字列n回

FOO FOO FOO FOOバーバーfooのバーfooのバー

私はどの部分でブーと2つのランダムFOOSを交換したい:

例えば、私はテキストを持っています上記の文字列の

  1. FOO FOOブーイングfooのバーバーfooのバーブーバー
  2. ブーイングFOO FOO FOOバーバーブーバーfooのバー
  3. fooのブーイングfooのブーイングバーバーfooのバー:

    これらは、可能な結果でありますfooのバー

  4. など。

答えて

3
str = "foo foo foo foo bar bar foo bar foo bar" 
num = 2 
# get an array of all foo's; replace 2 foos with boo; shuffle the array. 
ar = (["boo"]*num + str.scan(/foo/)[num..-1]).shuffle 
# replace each foo with the next element of the array. 
str.gsub(/foo/){ ar.pop } 
+0

+1。 – dbenhur

+0

thx、それは私のためのよりよい解決策です! :) – enRai

0

あなたはstring.index("substring")と交換したい部分文字列の出現をすべて見つけることができます。部分文字列の最初の文字のインデックスを取得します。

次に、このインデックスの後に部分文字列を使用して、置き換えたい文字列の次の一致を見つけることができます。

置換する部分文字列が始まるすべてのインデックスを格納し、乱数を使用して置換する必要のあるインデックスを定義します。

0

最短のものである:簡潔かつ正確な両方であるため

str.gsub(/foo/){|v| rand(2) == 0 ? 'boo' : v} 
+0

これは確率的に 'fooだけでなく2' fooの半分を置き換えます – dbenhur

関連する問題