在Java Regex中匹配空格

时间:2013-03-11 17:04:09

标签: java regex validation

我正在用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-44444444444444,但在输入444 444 4444时会返回错误的答案。我已经看了几个关于堆栈溢出的类似问题,但是我还没有找到一个能够正常解决我的问题的修复程序。有人能告诉我我错过了什么吗?

5 个答案:

答案 0 :(得分:2)

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

问题是Scanner#next()会返回whitespace-delimited tokens by default,,因为您没有另行指定分隔符。

  

Scanner使用分隔符模式将其输入分解为标记,该分隔符模式默认匹配空格。

如果您想逐行输入,请使用Scanner#nextLine()。  http://ideone.com/O3Hu0Z

答案 1 :(得分:1)

问题不在于您的正则表达式模式,而在于传入的实际String

Scanner#next使用空格作为分隔符,因此当您使用4444作为输入值时,只会传入第一个444 444 4444标记。你可以用

String str = sc.nextLine();

答案 2 :(得分:0)

我认为这个问题不是你的正则表达式,而是你如何阅读你的字符串。 Scanner#next()返回它找到的下一个标记并在分隔符上拆分标记,空格是默认的分隔符

请尝试使用Scanner#nextLine()

答案 3 :(得分:0)

使用Scanner.nextLine()按换行符分隔,而不仅仅是任何空白字符。使用next(),第三种情况得到“444”。

警惕点“。”匹配任何角色。

正确的正则表达式如下所示:

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

答案 4 :(得分:0)

 String str ="444 444 4444";
System.out.print(str.matches("\\d{3}([-. ])?\\d{3}([-. ])?\\d{4}"));

你的代码没有问题。只需添加

String str=sc.nextLine();