我使用以下代码验证电话号码。要求是电话号码应在10-25个字符之间,应包括hypen( - ),句号(。),括号()。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ValidatePhoneNumber {
public static void main(String[] argv) {
String phoneNumber = "6058.8()6-05888,9994567";
System.out.println(phoneNumber.length());
//String sPhoneNumber = "605-88899991";
//String sPhoneNumber = "605-888999A";
String regex = "^[0-9.()-]{10,25}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(phoneNumber);
if (matcher.matches()) {
System.out.println("Phone Number Valid");
} else {
System.out.println("Phone Number must be in the form XXX-XXXXXXX");
}
}
}
我检查了验证及其工作正常,我想添加一个空格字符“\ s”,以便在电话号码之间也可以有空格。但是在正则表达式中添加“\ s”时会出错。
答案 0 :(得分:7)
请查看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 :(得分:3)
我建议不对电话号码如此挑剔,人们喜欢用自己的方式使用空格和括号,这样的严格性可能会让人烦恼。为什么不将它限制为仅限数字,否则空格/括号等是否可以?
此外 - 有时国际号码使用'+'字符。
答案 2 :(得分:1)
你在main()方法中有这个,大概是为了在这里发布。但是,如果此代码多次运行,您应该考虑在调用方法之外移动正则表达式编译。编译可能很昂贵。
请注意,java.util.regex.Pattern是线程安全的,java.util.regex.Matcher不是那么标准的习惯用语是这样的:
public class PhoneNumberValidator {
private static Pattern VALID_PHONE_NUMBER =
Pattern.compile("^[0-9.()-]{10,25}$");
public boolean isValidPhoneNumber(String s) {
Matcher m = VALID_PHONE_NUMBER.matcher(s);
return m.matches();
}
}
答案 3 :(得分:0)
可能这样的事情会更好
"\\(?[\\d]{3}\\)?\\-?[\\d]{w}\\-?[\\d]{4}"
不知道会有多国际化,但它应该给你一个想法。你的问题是它会捕获很多奇怪的数字,连字符和括号组合。
答案 4 :(得分:0)
我使用这个正则表达式:“^(1 [\ s - ]?)?(((\ d {3}))|(\ d {3}))[\ s - ]?\ d {3} [\ s - ]?\ d {4} $“这可能比我真正需要的还要多,特别是因为我在手机上工作所以人们很少使用parens或破折号,但这让我感到高兴。