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

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

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

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

Q&A

解決済

2回答

1056閲覧

文字列が条件に合うかどうか(正規表現?)

torisan

総合スコア678

Ruby

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

0グッド

0クリップ

投稿2016/12/06 02:50

編集2016/12/06 02:57

変数に入っている文字列が
以下の条件を満たしているかを判定したいです。
rubyのバージョンは1.9.3になります。

①"0"か"1"か"2"か"3"か","のみで構成されている事
②数字は7桁を1セットとする事(0102030 等)
③最初及び最後の文字は数字である事
④","は連続しない事。(数字が連続して14桁、21桁..になるのはOK)

以下にOKの場合とNGの場合の例を挙げます.
※見易くするために改行していますが、
実際には改行は含まれません。
※------は区切り文字です。実際の文字列には含まれません。

・OKの場合

OKの場合

1------------------ 2(空白) 3 ※例外でOKとします。 4 あまり煩雑になるようでしたら別途判定をしますので 5 無視しても構いません。 6------------------ 70000100 8------------------ 91000201 100000000 11, 120000000 13------------------ 140033102 15, 160010020 17, 181002000 19------------------ 201000020 21, 220000000 230000000

・NGの場合

NGの場合

1------------------数字が7の倍数の桁数でない(10桁) 20000000 3, 40111011 5100 6, 70000100 8------------------数字が7の倍数の桁数でない(4桁と3桁) 91201 10, 11001 12------------------","が連続している 130000000 14, 15, 160030010 17------------------","から始まっている 18, 190020010 20------------------","で終わっている 210100200 22, 23------------------0123,以外の文字が使われている 240050000

この判定をする為に、以下の正規表現を作成してみたのですが、
数字の桁数が10桁などの場合にうまくいきません。
(他にも何か不具合があるかもしれません……)

if moji.match(/\A[0-3]{7}|,*[0-3]{7}\z/) == nil then

あまり重くなければ別に正規表現である必要もありません。
以上、何かいい手がありましたら教えて頂けると嬉しいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/
この正規表現でいいはずです。
OK例の空白というのは、moji == ""と解釈しましたが、もしmoji=" "(スペース)ということなら、|の後ろにスペースか\sをつけてください。

質問文にある正規表現だと、|の前後どちらかにマッチすればよいので、\A[0-3]{7}だけにマッチしてもOKということになってしまいます。

投稿2016/12/06 03:25

takara7

総合スコア107

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

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

torisan

2016/12/06 04:08

回答ありがとうございます。 今、手元に実行環境がありませんので確認次第再度返答させて頂きます。
torisan

2016/12/06 10:57

以下のテストケースでテストを行いました。 p "".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>"" p "000".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>nil p "0001000".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>"0001000" p "000000000".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>nil p "00000101103021".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>"00000101103021" p "1111111,123,1112311".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>nil p ",0000000".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>nil p "1110000,".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>nil p "12312310000000".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>"12312310000000" p "0000000,0000000,1111111".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>"0000000,0000000,1111111" p "00000001111111,22222223333333".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>"00000001111111,22222223333333" p "5000000".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>nil p "1000000,,1000000".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>nil p "10000001111111,22222223333333,1000000,12312310101010".match(/\A(?:[0-3]{7}(?:,?[0-3]{7})*|)\z/) #=>"10000001111111,22222223333333,1000000,12312310101010" 全てのパターンにおいて期待通りの結果が出力されました。 回答ありがとうございました! ……今から、この書き方の解読を始めます。(汗笑
guest

0

質問の内容以前に気になった問題がありまして、

rubyのバージョンは1.9.4になります。

Rubyは1.9.3の次が2.0.0になったので、「1.9.4」というバージョンのものはリリースされていません。まずは正確なRuby環境のご確認をお願いします。

投稿2016/12/06 02:54

maisumakun

総合スコア145121

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

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

torisan

2016/12/06 03:00

記憶違いだったようです。 バージョンは1.9.3になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問