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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

9989閲覧

改行区切りの8桁の数字が3つ以内かどうかを検証する正規表現について

toroleaman

総合スコア95

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

2クリップ

投稿2014/12/08 15:28

下記のような条件の正規表現を書きたいのですが、うまくいきません。

条件

・改行区切りの8桁以内の数字が3つ以内ならOK
「12345678\n12345678\n12345678」は、OK
「12345678\n12345678\n12345678\n」は、NG ★これがうまくいきません
「12345678\n」は、OK
「12345678\n\n」は、OK
「12345678」は、OK
「」は、OK
「1」は、OK
「123456789」は、NG
・「\n」でsplitする方法は、NG

ソース

lang

1public boolean testFilevaild() { 2 //String str = "12345678\n12345678\n12345678"; // OK 3 String str = "12345678\n12345678\n12345678\n"; // ★NGとしたいがmatchしてしまう 4 //String str = "12345678\n"; // OK 5 //String str = "12345678\n\n"; // OK 6 String regex = "^([0-9]{0,8}\n){0,2}([0-9]{0,8})$"; 7 Pattern p = Pattern.compile(regex); 8 Matcher m = p.matcher(str); 9 return m.find(); 10}

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

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

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

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

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

guest

回答3

0

Java は全くの素人ですが・・・

LL界ではわりと有名なことなのですが、$ が末尾の改行にもマッチするからではないでしょうか?

以下のように、先頭には \A を、末尾には \z を使うと良いと思います。

lang

1public static boolean testFilevaild() { 2 //String str = "12345678\n12345678\n12345678"; // OK 3 String str = "12345678\n12345678\n12345678\n"; // NG 4 //String str = "12345678\n"; // OK 5 //String str = "12345678\n\n"; // OK 6 String regex = "\A([0-9]{0,8}\n){0,2}([0-9]{0,8})\z"; 7 Pattern p = Pattern.compile(regex); 8 Matcher m = p.matcher(str); 9 return m.find(); 10}

投稿2014/12/08 16:43

ngyuki

総合スコア4514

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

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

toroleaman

2014/12/08 22:30

なるほど。早速試してみます。ありがとうございます。
toroleaman

2014/12/09 11:26

m.find()のまま、 String regex = "\A([0-9]{0,8}\n){0,2}([0-9]{0,8})\z"; を試したらうまくいきました。ありがとうございます。
guest

0

ベストアンサー

文字列全体のマッチですと、m.find()ではなく、m.matches()ではないでしょうか。

投稿2014/12/09 00:37

jcs502ulf

総合スコア307

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

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

toroleaman

2014/12/09 03:44

あー、やらかしてますね。 だからかー。見落としてました。試してみます。 ありがとうございます。
toroleaman

2014/12/09 11:28

m.matchesを試してみました。うまくいきました。 ありがとうございました。
guest

0

全体でマッチさせるには、Matcher#matchesもしくはString.matchesを使うのが良いです。

lang

1final String regex = "^([0-9]{0,8}\n){0,2}([0-9]{0,8})$"; 2String[] a = { "12345678\n12345678\n12345678", "12345678\n12345678\n12345678\n", "12345678\n", "12345678\n\n", }; 3for (final String s : a) { 4 final boolean matched = s.matches(regex); 5 System.out.printf("[%s] => %s%n", s, matched); 6}

投稿2014/12/09 01:18

argius

総合スコア9390

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

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

toroleaman

2014/12/09 11:30

回答およびソースのご提示ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問