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-4444and 4444444444,但是当我输入 时返回不正确的答案444 444 4444。我已经查看了几个关于堆栈溢出的类似问题,但我仍然没有找到适合我的问题的修复程序。有人可以告诉我我错过了什么吗?

4

5 回答 5

2

模式很好:http: //ideone.com/Y4Hlph

问题是默认情况下Scanner#next()返回以空格分隔的标记,因为您没有另外指定分隔符。

AScanner使用分隔符模式将其输入分解为标记,默认情况下匹配空格。

Scanner#nextLine()如果您想逐行获取输入, 请使用。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#next()返回它找到的下一个标记并在分隔符上拆分标记,默认情况下空格是分隔符

尝试Scanner#nextLine()改用。

于 2013-03-11T17:07:06.583 回答
0

用于Scanner.nextLine()用换行符分隔,而不仅仅是任何空白字符。对于next()第三种情况,您会得到“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 回答