2012-02-15 9 views
11

この文字列を分割するにはどうすればいいですか?ルビは文字またはスペースを繰り返して文字列を分割します

"6885558 8866887777" => ["6", "88", "555", "8", "88", "66", "88", "7777"] 

私はこれを試しましたが、うまくいかなかった。

ruby-1.8.7-p334 :020 > "111133".split(/(\d)\1+/) 
=> ["", "1", "", "3"] 
+0

私は 'split'はないと思いますメソッドは 'split'でマッチした文字を取り除くので、動作します。代わりに文字列を繰り返し処理する必要があるかもしれないと思います。優れた説明は – Oliver

答えて

24

splitちょうどそれが問題になっている文字列から削除し、区切り文字として一致したものを使用します。あなたが探していることはscan次のとおりです。

str = "6885558 8866887777" 
str.scan(/((\d)\2*)/).map(&:first) 
# => ["6", "88", "555", "8", "88", "66", "88", "7777"] 

遅いそれを取ると、\dは任意の数字に一致します。 2番目のキャプチャグループに入っているので、\2*は、同じ数字のそれ以降の出現と一致します。これは、私たちがのみサブアレイの各々の最初の項目をしたいので、私たちはmap(&:first)でそれらすべてを収集することができ

[["6", "6"], ["88", "8"], ["555", "5"], ["8", "8"], 
["88", "8"], ["66", "6"], ["88", "8"], ["7777", "7"]] 

のように見えるの配列を生成します。

str.scan(/(\d)\1*/)は、単に我々が唯一の可能性が繰り返される数字の列から一桁を取得したい意味し、最初のキャプチャグループの外に列を生成することに注意してください。)

+2

+1です。 –

+0

これは役に立つsooo、感謝でした。 – Robin