【问题标题】:how to check phone number format is valid or not from telephony manager?如何从电话经理检查电话号码格式是否有效?
【发布时间】:2014-11-04 00:21:16
【问题描述】:

为了检查电话号码(我有像 +918172014908 这样的模式电话号码)验证我使用 libphonenumber.jar 文件.. 它根据国家/地区检查电话号码是否有效。 我用这个:--

 PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); 
         PhoneNumber numberProto = phoneUtil.parse("phone_number", "");  
        phoneUtil.isValidNumber(numberProto) == true ? "valid" : "phone no not valid"

它工作正常..但是这个 jar 文件需要一些内存.. 没有 libphonenumber.jar 是否有另一种方法可以检查电话号码格式验证??? 你能推荐点什么吗???

【问题讨论】:

标签: java android validation


【解决方案1】:

考虑到有关电话号码格式的这些事实:-

  1. 国家/地区代码前缀以“+”开头,有 1 到 3 位数字
  2. 号码的最后一部分,也称为订户号码,是所有号码中的 4 位数字
  3. 大多数国家的电话号码在不包括国家代码后都有 10 位数的电话号码。一般的观察结果是,所有国家/地区的电话号码在排除国家/地区代码后都介于 8 到 11 位之间。
String allCountryRegex = "^(\\+\\d{1,3}( )?)?((\\(\\d{1,3}\\))|\\d{1,3})[- .]?\\d{3,4}[- .]?\\d{4}$";

让我们打破正则表达式并理解,

  • ^ 表达式开始
  • (\\+\\d{1,3}( )?)? 是 1 到 3 位数字之间的可选国家/地区代码匹配,前缀为“+”符号,后跟空格或不带空格。
  • ((\\(\\d{1,3}\\))|\\d{1,3} 是 1 到 3 位数字的强制组,带或不带括号,后跟连字符、空格或不带空格。
  • \\d{3,4}[- .]? 是由 3 位或 4 位数字组成的强制组,后跟连字符、空格或无空格
  • \\d{4} 是最后 4 位的必填组
  • $ 表达式结束

此正则表达式模式匹配大多数国家/地区的电话号码格式,包括:-

        String Afghanistan      = "+93 30 539-0605";
        String Australia        = "+61 2 1255-3456";
        String China            = "+86 (20) 1255-3456";
        String Germany          = "+49 351 125-3456";
        String India            = "+91 9876543210";
        String Indonesia        = "+62 21 6539-0605";
        String Iran             = "+98 (515) 539-0605";
        String Italy            = "+39 06 5398-0605";
        String NewZealand       = "+64 3 539-0605";
        String Philippines      = "+63 35 539-0605";
        String Singapore        = "+65 6396 0605";
        String Thailand         = "+66 2 123 4567";
        String UK               = "+44 141 222-3344";
        String USA              = "+1 (212) 555-3456";
        String Vietnam          = "+84 35 539-0605";

如果您了解上述正则表达式,那么您还可以制作特定国家/地区的正则表达式模式来验证电话号码:-

String indiaRegex = "^(\\+\\d{2}( )?)?((\\(\\d{3}\\))|\\d{3})[- .]?\\d{3}[- .]?\\d{4}$";
String singaporeRegex = "^(\\+\\d{2}( )?)?\\d{4}[- .]?\\d{4}$";

来源:https://codingnconcepts.com/java/java-regex-for-phone-number/

【讨论】:

    【解决方案2】:

    试试这个:

    /**
     * This method is used to set filter type of us phone number.
     * @param phone
     */
     public static void setFilterTypeOfUSPhoneNumber(final TextView phone){
    
            InputFilter filter = new InputFilter() { 
                public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { 
                        String pattern = "0123456789()- ";
                        for (int i = start; i < end; i++) { 
                                if (pattern.indexOf(source.charAt(i)) < 0 ||
                                        source.length() > 14) { 
                                        return ""; 
                                } 
                        } 
                        return null; 
                } 
            }; 
    
            phone.setFilters(new InputFilter[]{filter ,new InputFilter.LengthFilter(14)});
            phone.addTextChangedListener(new TextWatcher() {
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {}
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    
                @Override
                public void afterTextChanged(Editable s) {
    
                    if(s.length() > 1){
    
                        if(s.length() < 5){
                            if(s.toString().indexOf("(") != 0 ||
                                    checkSpecialCharsPositions(s.toString())){
                                String str = s.toString();
                                str = replaceStrings(str);
                                str = "("+str;
                                s.clear();
                                s.append(str);
                                phone.setText(s);
    
                            }
                        }
                        else if(s.length() < 10){
                            if(s.toString().indexOf("(") != 0 ||
                                    s.toString().indexOf(")") != 4 ||
                                    checkSpecialCharsPositions(s.toString())){
                                String str = s.toString();
                                str = replaceStrings(str);
                                str = "("+str.substring(0, 3)+") "+str.substring(3);
                                s.clear();
                                s.append(str);
                                phone.setText(s);
                            }
                        }
                        else {
                            if(s.toString().indexOf("(") != 0 ||
                                    s.toString().indexOf(")") != 4 ||
                                    s.toString().indexOf("-") != 9 ||
                                    checkSpecialCharsPositions(s.toString())){
    
                                String str = s.toString();
                                str = replaceStrings(str);
                                str = "("+str.substring(0, 3)+") "+str.substring(3,6) + "-" + str.substring(6);
                                s.clear();
                                s.append(str);
                                phone.setText(s);
                            }
                        }
                    }
                    Selection.setSelection(s,s.length());
                }
    
                private String replaceStrings(String str){
                    str = str.replace("(", "");
                    str = str.replace(")", "");
                    str = str.replace(" ", "");
                    str = str.replace("-", "");
                    return str;
                }
    
                private boolean checkSpecialCharsPositions(String str){
    
                    return (str.indexOf("(") != str.lastIndexOf("(") ||
                            str.indexOf(")") != str.lastIndexOf(")") ||
                            str.indexOf("-") != str.lastIndexOf("-"));
                }
            });
    
        }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      public static boolean isValidPhoneNo(CharSequence iPhoneNo) {
          return !TextUtils.isEmpty(iPhoneNo) &&
               Patterns.PHONE.matcher(iPhoneNo).matches();
      }
      

      【讨论】:

      • Patterns 来自哪里?
      • 它来自 core.java.android.util.Patterns 但你的答案没有指定
      • 来自Patterns.Phone javadoc:无意for validating whether something is in fact a phone number. It will miss many things that are legitimate phone numbers.
      【解决方案4】:

      这个答案可能会对您有所帮助: https://stackoverflow.com/a/5959341

      要验证字符串,请使用

      if (setNum.matches(regexStr))
      where regexStr can be:
      
      //matches numbers only
      String regexStr = "^[0-9]*$"
      
      //matches 10-digit numbers only
      String regexStr = "^[0-9]{10}$"
      
      //matches numbers and dashes, any order really.
      String regexStr = "^[0-9\\-]*$"
      
      //matches 9999999999, 1-999-999-9999 and 999-999-9999
      String regexStr = "^(1\\-)?[0-9]{3}\\-?[0-9]{3}\\-?[0-9]{4}$" 
      

      在美国有一个很长的正则表达式来验证电话(7 到 10 位数字,允许分机等)。来源来自这个答案:电话号码验证的综合正则表达式

      String regexStr = "^(?:(?:\\+?1\\s*(?:[.-]\\s*)?)?(?:\\(\\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\\s*\\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\\s*(?:[.-]\\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\\s*(?:[.-]\\s*)?([0-9]{4})(?:\\s*(?:#|x\\.?|ext\\.?|extension)\\s*(\\d+))?$"
      

      【讨论】:

        【解决方案5】:

        您可以使用简单的regex。说我的电话号码格式是012-1234567

        您可以使用\\d{3}-\\d{7} 来验证它们。

        例如:

        String number = "012-1234567";
        Pattern pattern = Pattern.compile("\\d{3}-\\d{7}");
        Matcher matcher = pattern.matcher(number); 
         if (matcher.matches()) {
              System.out.println("Phone Number Valid");
         }
        

        【讨论】:

        • 这将是一个 long 正则表达式列表,涵盖所有国家/地区的所有有效电话号码。
        • @ArijitPatra 是的。您可以使用电话号码列表并对其进行迭代并使用此正则表达式进行验证。这只是一个例子。
        • 或者只是 /^(?:(?:(?(?:00|\+)([1-4]\d\d|[1-9]\d?))? )?[\-\.\ \\\/]?)?((?:(?\d{1,})?[\-\.\ \\\/]?){0,})(? :[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i跨度>
        猜你喜欢
        • 1970-01-01
        • 2017-10-27
        • 2019-12-20
        • 2022-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多