1. ホーム
  2. java

[解決済み] Javaで文字列が数字だけを含むかどうかを確認する方法

2022-04-23 16:08:39

質問

Java の String クラスには matches というメソッドがありますが、このメソッドを使用して、正規表現を使用して文字列が数字だけであるかどうかをチェックするにはどうすればよいですか。以下の例で試してみましたが、どちらも結果はfalseでした。

String regex = "[0-9]";
String data = "23343453";
System.out.println(data.matches(regex));


String regex = "^[0-9]";
String data = "23343453";
System.out.println(data.matches(regex));

解決方法は?

試す

String regex = "[0-9]+";

または

String regex = "\\d+";

Javaに準ずる 正規表現 は、その + は「1回以上」という意味であり \d は「数字」を意味します。

注:"ダブルバックスラッシュ"は エスケープシーケンス を使うとシングルバックスラッシュになる - というわけです。 \\d をjavaのStringに書くと、実際の結果が得られます。 \d

参考文献


編集する 他の回答で混乱があったため、テストケースを書いているので、もう少し詳しく説明します。

まず、この解決策(または他の解決策)が正しいかどうか疑わしい場合、このテストケースを実行してください。

String regex = "\\d+";

// positive test cases, should all be "true"
System.out.println("1".matches(regex));
System.out.println("12345".matches(regex));
System.out.println("123456789".matches(regex));

// negative test cases, should all be "false"
System.out.println("".matches(regex));
System.out.println("foo".matches(regex));
System.out.println("aa123bb".matches(regex));

質問1:

を追加する必要はないのでしょうか? ^$ を正規表現に追加すると、 "aa123bb" にマッチしなくなります。

いいえ。 javaでは matches メソッド (質問で指定されたもの) は、断片ではなく完全な文字列にマッチします。言い換えれば、文字列の断片にマッチさせるために ^\\d+$ (これも正しいのですが)。最後の否定的なテストケースをご覧ください。

オンラインの正規表現チェッカを使用した場合、この動作は異なる可能性があることに注意してください。Javaで文字列の断片にマッチさせるために find メソッドに置き換えます。詳細はこちらで説明します。

Java Regexにおけるmatches()とfind()の違い

質問2:

この正規表現は空の文字列にもマッチしませんか。 "" ?*

いいえ。 正規表現 \\d* は空の文字列にマッチしますが \\d+ はありません。スター * はゼロ以上を意味するのに対し、プラス + は1つ以上を意味します。最初の否定的なテストケースをご覧ください。

質問3

<ブロッククオート

正規表現Patternをコンパイルした方が早いのでは?

はい、そうです。 を毎回実行するよりも、一度だけ正規表現パターンをコンパイルする方が確かに速いです。 matches そのため、パフォーマンス上の意味を重視するのであれば Pattern は、このようにコンパイルして使うことができる。

Pattern pattern = Pattern.compile(regex);
System.out.println(pattern.matcher("1").matches());
System.out.println(pattern.matcher("12345").matches());
System.out.println(pattern.matcher("123456789").matches());