【问题标题】:java phone number validationjava电话号码验证
【发布时间】:2011-02-03 01:17:16
【问题描述】:

这是我的问题:

为电话号码创建一个构造函数,给定一个字符串,格式为 xxx-xxx-xxxx 或 xxx-xxxx 用于本地号码。如果格式无效,则抛出异常。

所以我想使用正则表达式来验证它,但我不知道我是否正确地做。还有我必须抛出什么样的异常?我需要创建自己的异常吗?

    public TelephoneNumber(String aString){
        if(isPhoneNumberValid(aString)==true){
            StringTokenizer tokens = new StringTokenizer("-");
            if(tokens.countTokens()==3){
                areaCode = Integer.parseInt(tokens.nextToken());
                exchangeCode = Integer.parseInt(tokens.nextToken());
                number = Integer.parseInt(tokens.nextToken());
            }
            else if(tokens.countTokens()==2){
                exchangeCode = Integer.parseInt(tokens.nextToken());
                number = Integer.parseInt(tokens.nextToken());
            }
            else{
                //throw an excemption here
            }
        }

    }


 public static boolean isPhoneNumberValid(String phoneNumber){
     boolean isValid = false;

     //Initialize reg ex for phone number.
    String expression = "(\\d{3})(\\[-])(\\d{4})$";
    CharSequence inputStr = phoneNumber;
    Pattern pattern = Pattern.compile(expression);
    Matcher matcher = pattern.matcher(inputStr);
    if(matcher.matches()){
        isValid = true;
     }
        return isValid;
    }

您好,抱歉,是的,这是作业。对于此分配,唯一有效的格式是 xxx-xxx-xxxx 和 xxx-xxxx,所有其他格式 (xxx)xxx-xxxx 或 xxxxxxxxxx 在这种情况下都无效。

我想知道我的正则表达式是否正确

【问题讨论】:

  • 这是作业吗?如果是这样,应该这样标记......
  • 显而易见的问题:您确定您的电话号码格式可以捕获用户可能想要输入的任何电话号码吗?没有什么比拒绝接受完全有效数据的半智能系统更令人沮丧的了。 (哦,如果这只是家庭作业 - 没关系。)
  • 完全同意@Tomalak。如果这是一个生产系统,正确的答案是去掉所有非数字字符并验证结果数字。
  • StringTokenizer 是不好的做法。
  • "StringTokenizer 是不好的做法。" @fuzzy lollipop,提供解释为什么这是不好的做法会很有帮助,如下面@haldean 的回答。

标签: java regex validation


【解决方案1】:

字符串密码 = "589877";

    Pattern pattern = Pattern.compile("\\d{6}");

\d 表示数字。大括号内的位数 Matcher matcher = pattern.matcher(pincode);

    if (matcher.matches()) {
        System.out.println("Pincode is Valid");
        return true;
    } else {
        System.out.println("pincode must be a 6 digit Number");

【讨论】:

    【解决方案2】:
    ^(([(]?(\d{2,4})[)]?)|(\d{2,4})|([+1-9]+\d{1,2}))?[-\s]?(\d{2,3})?[-\s]?((\d{7,8})|(\d{3,4}[-\s]\d{3,4}))$
    

    匹配: (0060)123-12345678, (0060)12312345678, (832)123-1234567, (006)03-12345678,

    (006)03-12345678, 00603-12345678, 0060312345678

    0000-123-12345678、0000-12-12345678、0000-1212345678 ...等

    1234-5678, 01-123-4567

    可以用空格替换“-”,即 (0080) 123 12345678

    还匹配 +82-123-1234567、+82 123 1234567、+800 01 12345678 ... 等。

    更多关于家庭/私人号码。 不适用于 1-800-000-0000 类型的号码

    *Tested with Regex tester http://regexpal.com/

    【讨论】:

    • 请阅读问题而不仅仅是标题。这并不是 OP 所要求的。 “对于这个分配,唯一有效的格式是 xxx-xxx-xxxx 和 xxx-xxxx,所有其他格式 (xxx)xxx-xxxx 或 xxxxxxxxxx 在这种情况下都是无效的。”
    • 由于这是您第二次这样做,我只想告知 Stack Overflow 是一个问答网站。这不是一个论坛,每个寻找确切答案的人都必须通过一堆重复/过于笼统的答案才能找到自己正在寻找的确切答案。
    • 仅供参考,很多开发人员都在寻找“相似”但不准确的答案。我只是想回馈社区,这样他们就不必费力地浏览其他网站来寻找他们想要的东西。就像我的情况一样,我只想拥有一个全面的验证正则表达式,这个页面启发了我。尽管没有直接回答,但我的帖子至少适合上下文。很难找到提出相同问题的人。
    【解决方案3】:

    所以我想使用正则表达式来验证它,但我不知道我是否正确。

    它确实看起来过于复杂。此外,匹配xxx-xxx-xxxxxxx-xxxx 其中x 是一个数字可以用"(\\d{3}-){1,2}\\d{4}" 更好地完成。要了解有关正则表达式的更多信息,我建议您通过http://regular-expressions.info

    我还要抛出什么样的异常?我需要创建自己的异常吗?

    ValidatorException 似乎直截了当。

    public static void isPhoneNumberValid(String phoneNumber) throws ValidatorException {
        if (!phoneNumber.matches(regex)) {
            throws ValidatorException("Invalid phone number");
        }
    }
    

    如果您出于某些原因不想自己创建一个,那么我可能会选择IllegalArgumentException,但我仍然不建议这样做。

    也就是说,这种验证当然不包括国际和/或外部电话号码。除非这真的是家庭作业,否则我建议重新考虑验证。

    【讨论】:

      【解决方案4】:

      您可以按照 BalusC 的建议轻松匹配这些模式。

      附带说明,StringTokenizer 已被弃用。来自JavaDoc

      StringTokenizer 是一个遗留类,出于兼容性原因保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人使用 String 的 split 方法或 java.util.regex 包。

      将字符串拆分为适当段的更简单方法是:

      String phoneParts[] = phoneNumber.split("-");
      

      【讨论】:

        猜你喜欢
        • 2021-05-22
        • 2015-02-22
        • 2012-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多