試す
String regex = "[0-9]+";
また
String regex = "\\d+";
Javaの正規表現によると、 +
は「1 回以上」を\d
意味し、「数字」を意味します。
注:「二重のバックスラッシュ」は、単一のバックスラッシュを取得するためのエスケープ シーケンス\\d
です。したがって、 Java 文字列では実際の結果が得られます。\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:
^
正規表現にandを追加する必要はない$
ので、「aa123bb」と一致しませんか?
いいえ。Java では、matches
(質問で指定された) メソッドはフラグメントではなく完全な文字列に一致します。つまり、使用する必要はありません^\\d+$
(正しいとしても)。最後のネガティブ テスト ケースを参照してください。
オンラインの「正規表現チェッカー」を使用すると、動作が異なる場合があることに注意してください。Java で文字列のフラグメントを一致させるには、代わりにメソッドを使用できますfind
。詳細については、次を参照してください。
Java正規表現のmatches()とfind()の違い
質問2:
この正規表現は空の文字列にも一致しません""
か?*
いいえ。正規表現\\d*
は空の文字列に一致しますが、一致\\d+
しません。星印*
は 0 個以上を意味し、プラス+
は 1 個以上を意味します。最初のネガティブ テスト ケースを参照してください。
質問 3
正規表現パターンをコンパイルする方が高速ではありませんか?
はい。を呼び出すたびに正規表現パターンをコンパイルするよりも、一度コンパイルする方が確かに高速です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());