質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1493閲覧

N個以上連続するなら区切らないようにするには?

manman

総合スコア233

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2015/04/12 14:46

編集2015/04/12 14:49

文字列
str = "0.188899999999933777777766622222226122E9"
から、N(>5)個以上連続するなら区切らず
配列
ary = ["0", ".", "1", "8", "8", "8", "999999999", "3", … , "2", "E", "9"]
を作るにはどうすればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

katoy

総合スコア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
ngyuki

総合スコア4514

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manman

2015/04/12 15:24

str = "0.1AAAEEEEEEEEE3377777777666222222226122E9" とかでも上手くいくのですが、/((.)\2{5,}|.)/の意味を教えていただけないでしょうか?
ngyuki

2015/04/12 15:46

回答に追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問