Java中的电话号码验证

时间:2012-02-23 11:40:26

标签: java regex validation

我使用以下代码验证电话号码。要求是电话号码应在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”时会出错。

5 个答案:

答案 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或破折号,但这让我感到高兴。