2

Java で電話アプリケーションを作成しており、電話番号が次のいずれかの形式に適合するかどうかを検証できる必要があります。

  • 444 444 4444
  • 444-444-4444
  • 4444444444

このタスクを達成するために、私はこれを書きました:

public static void main(String[] args){
    Scanner sc = new Scanner(System.in);
    String str = sc.next();
    System.out.print(str.matches("\\d{3}([-. ])?\\d{3}([-. ])?\\d{4}"));
}

何らかの理由で、 String メソッドはとmatches()に対して完全に機能しますが、 を入力すると間違った答えを返します。スタック オーバーフローに関するいくつかの同様の質問を調べましたが、問題に対して正しく機能する修正がまだ見つかりません。誰かが私に欠けているものを教えてもらえますか?444-444-44444444444444444 444 4444

4

5 に答える 5

2

パターンは問題ありません: http://ideone.com/Y4Hlph

問題は、区切り文字を指定していないため、デフォルトで空白で区切られたトークンScanner#next()を返すことです。

AScannerは、区切り文字パターンを使用して入力をトークンに分割します。これはデフォルトで空白に一致します。

Scanner#nextLine()入力を 1 行ずつ取得する場合に 使用します。http://ideone.com/O3Hu0Z

于 2013-03-11T17:07:12.903 に答える
1

問題は正規表現パターンではなく、実際Stringに渡されるものにあります。

Scanner#nextは空白を区切り文字として使用するため、入力値として4444使用する場合は最初のトークンのみを渡します。444 444 4444あなたが使用することができます

String str = sc.nextLine();
于 2013-03-11T17:07:00.847 に答える
0

Scanner.nextLine()空白文字だけでなく、改行で区切るために使用します。ではnext()、3 番目のケースで「444」が得られます。

ドット「.」に注意してください。任意の文字に一致します。

したがって、正しい正規表現は次のようになります。

\\d{3}([- ])?\\d{3}([- ])?\\d{4}

于 2013-03-11T17:11:23.680 に答える
0
 String str ="444 444 4444";
System.out.print(str.matches("\\d{3}([-. ])?\\d{3}([-. ])?\\d{4}"));

コードに問題はありません。追加するだけです

String str=sc.nextLine();
于 2013-03-11T17:12:23.553 に答える
0

問題は正規表現ではなく、文字列をどのように読み取っているのかだと思います。Scanner#next()は、見つかった次のトークンを返し、トークンを区切り記号で分割します。デフォルトでは空白が区切り記号です

Scanner#nextLine()代わりに使用してみてください。

于 2013-03-11T17:07:06.583 に答える