文字列
str = "0.188899999999933777777766622222226122E9"
から、N(>5)個以上連続するなら区切らず
配列
ary = ["0", ".", "1", "8", "8", "8", "999999999", "3", … , "2", "E", "9"]
を作るにはどうすればよいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
正規表現を使わず、素直に処理させる例を書いてみました。
(もっと短くできるとおもいますが、素直に書いてみました)
lang
1# coding: utf-8 2 3# See https://teratail.com/questions/8502 4 5def str_to_ary(str) 6 return nil if str == nil 7 8 # 同じ文字の連続 の配列をつくる。 9 # '12333' => ['1', '2', '333'] 10 work = [] 11 chank = '' 12 current_c = nil 13 str.chars do |c| 14 if c == current_c 15 chank += c 16 else 17 work << chank 18 current_c = c 19 chank = c 20 end 21 end 22 work << chank if chank.length > 0 23 24 # 長さが 5 以下なら、1 文字ずつに分割した配列にする。 25 # ['1', '2', '333'] => ['1', '2', '3', '3', '3'] 26 ans = [] 27 work.each do |a| 28 if a.length <= 5 29 ans += a.chars 30 else 31 ans << a 32 end 33 end 34 ans 35end 36 37str = "0.188899999999933777777766622222226122E9" 38p str_to_ary(str) 39 40p str_to_ary('123') 41p str_to_ary('123333333') 42p str_to_ary('') 43p str_to_ary(nil)
実行結果
["0", ".", "1", "8", "8", "8", "999999999", "3", "3", "7777777", "6", "6", "6", "2222222", "6", "1", "2", "2", "E", "9"] ["1", "2", "3"] ["1", "2", "3333333"] [] nil
投稿2015/04/12 21:23
総合スコア22324
0
ベストアンサー
こんな感じでしょうか
lang
1str = "0.188899999999933777777766622222226122E9" 2ary = str.scan(/((.)\2{5,}|.)/).map{|v|v[0]} 3p ary 4# => ["0", ".", "1", "8", "8", "8", "999999999", "3", ..., "2", "E", "9"]
N(>5)個以上連続するなら区切らず
>5
なので、5個以上、ではなく、5個より多い(=6個以上)としています。
次のようにバラして考えます。
lang
1( 2 (.) 3 \2 4 {5,} 5| 6 . 7)
|
で区切られた前半が任意の 6 個以上連続する文字列で、後半が任意の 1 文字にマッチします。
後半は説明するまでもないと思うので、前半だけ説明します。
(.)
任意の 1 文字にマッチします。
括弧で囲っているのでキャプチャされます。
これは 2 番目のキャプチャです。
1 番目は全体を囲っている ( )
です。
\2
2番目のキャプチャを後方参照します。
要するに↑の (.)
でマッチした文字です。
{5,}
直前のパターンが 5 個以上連続するという意味です。
要するに↑の \2
が 5 個以上連続するという意味です。
なので↑↑の (.)
が (.)
自身も含めて 6 個以上連続するという意味になります。
投稿2015/04/12 15:08
編集2015/04/12 15:46総合スコア4514
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。