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));
ベストアンサー1
試す
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+
一致しません。星印は*
0 以上を意味し、プラスは+
1 以上を意味します。最初の否定的なテスト ケースを参照してください。
質問3
正規表現パターンをコンパイルする方が速いのではないでしょうか?
はい。正規表現パターンを の呼び出しごとにコンパイルするよりも、 を 1 回コンパイルする方が確かに高速です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());