Java中的电话号码验证

Java中的电话号码验证,java,regex,validation,Java,Regex,Validation,我正在使用以下代码验证电话号码。要求是电话号码的长度应介于10-25个字符之间,应包括hypen(-)、句号(.)、括号() 我检查了验证,它工作正常,我想添加一个空白字符“\s”,以便在电话号码之间也可以有空白。但是在正则表达式中添加“\s”时会出现错误。我建议不要对电话号码过于挑剔,人们喜欢用自己的方式使用空格和括号,这种严格的做法只会让人恼火。为什么不把它限制在数字上,否则空格/括号等就可以了 此外,有时国际数字使用“+”字符。也许这样更好 "\\(?[\\d]{3}\\)?\\-?[\\

我正在使用以下代码验证电话号码。要求是电话号码的长度应介于10-25个字符之间,应包括hypen(-)、句号(.)、括号()

我检查了验证,它工作正常,我想添加一个空白字符“\s”,以便在电话号码之间也可以有空白。但是在正则表达式中添加“\s”时会出现错误。

我建议不要对电话号码过于挑剔,人们喜欢用自己的方式使用空格和括号,这种严格的做法只会让人恼火。为什么不把它限制在数字上,否则空格/括号等就可以了


此外,有时国际数字使用“+”字符。

也许这样更好

"\\(?[\\d]{3}\\)?\\-?[\\d]{w}\\-?[\\d]{4}"
我不知道这会有多国际化,但它会给你一个想法。你的问题是,它会捕获很多奇怪的数字、连字符和括号组合。

你在main()方法中有这个,大概是为了在这里发布。但是,如果多次运行此代码,则应考虑在调用方法之外移动ReGEX编译。编译可能很昂贵

请注意,java.util.regex.Pattern是线程安全的,而java.util.regex.Matcher不是线程安全的,因此标准习惯用法类似于:

公共类PhoneNumberValidator{
专用静态模式有效电话号码=
Pattern.compile(“^[0-9.--]{10,25}$”;
公共布尔值isValidPhoneNumber(字符串s){
匹配器m=有效的电话号码。匹配器;
返回m.matches();
}
}

请查看ITU E.164或IETF RfC 3966等标准。不要假设每个国家都有相同的惯例和数字长度

这是RfC 3966中的相关ABNF部分

global-number-digits = "+" *phonedigit DIGIT *phonedigit
phonedigit           = DIGIT / visual-separator 
visual-separator     = "-" / "." / "(" / ")"
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

我们最近在一个设备上遇到了一个巨大的问题,它不允许用户在电话号码中输入“+”。

我使用这个正则表达式:“^(1[\s-]?)((((\d{3})))|(\d{3})[\s-]?\d{3}[\s-]?\d{4}$”这可能比我真正需要的要多,特别是因为我在手机上工作,所以人们很少使用括号或破折号,但这让我很高兴。

“——”——”;”)“一个有效的电话号码?你的正则表达式会说是;)我会尝试用更完整的方法添加一个答案。此外,我认为你需要将括号和字符类中的点转义…否则你会匹配任何东西。不会
[0-9.-]
是否匹配任何字符?您可以进一步限制正则表达式。但在使用带+、空格等的国际数字之前,您应该生成一些测试用例,并指定其是否有效。然后您可以在所有测试字符串上测试正则表达式。
global-number-digits = "+" *phonedigit DIGIT *phonedigit
phonedigit           = DIGIT / visual-separator 
visual-separator     = "-" / "." / "(" / ")"
DIGIT = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"