【问题标题】:phone Number validation in javajava中的电话号码验证
【发布时间】:2015-02-22 06:20:37
【问题描述】:

我想以这种方式验证电话号码:-

该字段应允许用户输入字符并应自动更正。因此“+1-908-528-5656”的条目不会为用户创建错误,它只会更改为“19085285656”。

我也想在 9 到 11 之间编号。

我也尝试了下面的代码,但没有得出最终的解决方案:

 final String PHONE_REGEX = "^\\+([0-9\\-]?){9,11}[0-9]$";
 final Pattern pattern = Pattern.compile(PHONE_REGEX);
 String phone = "+1-908-528-5656";      
 phone=phone.replaceAll("[\\-\\+]", "");
 System.out.println(phone);
 final Matcher matcher = pattern.matcher(phone);
 System.out.println(matcher.matches()); 

【问题讨论】:

  • 你现在的代码有什么问题?难道你不能用{9,11} 替换{9,10} 来解决你的问题吗?
  • 如果你让这个工作,你会惹恼别人。
  • 它可以工作,但代码没有优化,应该有一个最好的(可以在一行中完成)方法来做到这一点。

标签: java regex validation


【解决方案1】:

您可以使用简单的String.matches(regex) 来针对正则表达式模式测试任何字符串,而不是使用PatternMatcher 类。

示例:

boolean isValid = phoneString.matches(regexPattern);

Find more examples

这是根据您的输入字符串的正则表达式模式:

\+\d(-\d{3}){2}-\d{4}

Online demo


最好使用Spring validation annotation 进行验证。

Example

【讨论】:

  • 你能告诉我 phoneString.matches(regexPattern); 之间有什么区别吗?和 Matcher matcher = pattern.matcher(phone); matcher.matches()
  • String.matches(regex) 用于匹配 整个 字符串,而模式和匹配器也可用于匹配子字符串。要使用模式和匹配器匹配整个字符串,您必须使用 ^$ 分别匹配字符串的开头和结尾。
【解决方案2】:
// The Regex not validate mobile number, which is in internation format.
// The Following code work for me. 
// I have use libphonenumber library to validate Number from below link.
// http://repo1.maven.org/maven2/com/googlecode/libphonenumber/libphonenumber/8.0.1/
//  https://github.com/googlei18n/libphonenumber
// Here, is my source code.

 public boolean isMobileNumberValid(String phoneNumber)
    {
        boolean isValid = false;

        // Use the libphonenumber library to validate Number
        PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
        Phonenumber.PhoneNumber swissNumberProto =null ;
        try {
            swissNumberProto = phoneUtil.parse(phoneNumber, "CH");
        } catch (NumberParseException e) {
            System.err.println("NumberParseException was thrown: " + e.toString());
        }

        if(phoneUtil.isValidNumber(swissNumberProto))
        {
            isValid = true;
        }

        // The Library failed to validate number if it contains - sign
        // thus use regex to validate Mobile Number.
        String regex = "[0-9*#+() -]*";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(phoneNumber);

        if (matcher.matches()) {
            isValid = true;
        }
        return isValid;
    }

【讨论】:

【解决方案3】:

假设您的输入字段采用任何类型的字符,而您只需要数字。

 String phone = "+1-908-528-5656";
 phone=phone.replaceAll("[\\D]","");
 if(phone.length()>=9 || phone.length()<=11)
   System.out.println(phone);

【讨论】:

    【解决方案4】:

    我们可以使用 String.matches(String regex)1 来使用 java 验证电话号码。

    示例代码 sn-p

    package regex;
    
    public class Phone {
        private static boolean isValid(String s) {
            String regex = "\\d{3}-\\d{3}-\\d{4}"; // XXX-XXX-XXXX
            return s.matches(regex);
        }
    
        public static void main(String[] args) {
            System.out.println(isValid("123-456-7890"));
        }
    
    }
    

    附:当我们在 java 字符串中使用时,我们使用额外的 '\' 进行转义的正则表达式模式。 (尝试在java程序中使用"\d{3}-\d{3}-\d{4}",会报错。

    【讨论】:

      【解决方案5】:

      假设您想要优化(这是您的评论所建议的)。

      这个怎么样? (“0”是排除如果他们给出完整的垃圾,甚至没有一个数字)。

       int parse(String phone){
           int num = Integer.parseInt("0"+phone.replaceAll("[^0-9]",""));
           return 100000000<=num&&num<100000000000?num:-1;
       }
      

      【讨论】:

        【解决方案6】:

        如果您与 匹配,我不确定但删除垃圾字符括号、空格和连字符 ^((\+[1-9]?[0-9])|0)?[7-9 ][0-9]{9}$ ,您可以验证手机号码

        private static final String PHONE_NUMBER_GARBAGE_REGEX = "[()\\s-]+";
        private static final String PHONE_NUMBER_REGEX = "^((\\+[1-9]?[0-9])|0)?[7-9][0-9]{9}$";
        private static final Pattern PHONE_NUMBER_PATTERN = Pattern.compile(PHONE_NUMBER_REGEX);
        
        public static boolean validatePhoneNumber(String phoneNumber) {
            return phoneNumber != null && PHONE_NUMBER_PATTERN.matcher(phoneNumber.replaceAll(PHONE_NUMBER_GARBAGE_REGEX, "")).matches();
        }
        

        【讨论】:

          【解决方案7】:

          一个简单易用的java手机验证正则表达式:

          public static final String PHONE_VERIFICATION = "^[+0-9-\\(\\)\\s]*{6,14}$";
          
          private static Pattern p;
          private static Matcher m;
          
          public static void main(String[] args)
          {
              //Phone validation
              p = Pattern.compile(PHONE_VERIFICATION);
              m = p.matcher("+1 212-788-8609");
              boolean isPhoneValid = m.matches();
          
              if(!isPhoneValid)
              {
                  System.out.println("The Phone number is NOT valid!");
                  return;
              }
              System.out.println("The Phone number is valid!");
          }
          

          【讨论】:

            【解决方案8】:

            我已经针对这种电话号码组合测试了一个正则表达式

            (294) 784-4554
            (247) 784 4554
            (124)-784 4783 
            (124)-784-4783
            (124) 784-4783
            +1(202)555-0138
            

            这个正则表达式肯定适用于所有美国号码

            \d{10}|(?:\d{3}-){2}\d{4}|\(\d{3}\)\d{3}-?\d{4}|\(\d{3}\)-\d{3}-?\d{4}|\(\d{3}\) \d{3} ?\d{4}|\(\d{3}\)-\d{3} ?\d{4}|\(\d{3}\) \d{3}-?\d{4}
            

            【讨论】:

              【解决方案9】:

              以@k_g 的答案为基础,但针对美国数字。

              static boolean isValidTelephoneNumber(String number) {
                  long num = Long.parseLong("0" + number.replaceAll("[^0-9]", ""));
                  return 2000000000L <= num && num < 19999999999L;
              }
              
              public static void main(String[] args) {
                  var numbers = List.of("+1 212-788-8609", "212-788-8609", "1 212-788-8609", "12127888609", "2127888609",
                          "7143788", "736103355");
              
                  numbers.forEach(number -> {
                      boolean isPhoneValid = isValidTelephoneNumber(number);
                      log.debug(number + " matches = " + isPhoneValid);
                  });
              }
              

              【讨论】:

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