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