Android手机号码校验功能46开头号码尾位无法识别问题咨询
问题排查及修复方案
错误点梳理
trimPhoneNumber逻辑疏漏:仅处理了带加号前缀的+46,如果输入号码是不带加号的46开头(比如你测试用的46123456789),前缀46会被保留在处理后的字符串中,导致后续正则匹配长度不符- 正则语法错误1:正则中表示“或”需要用
|而不是/,你写的(0/46)会被识别为匹配完整的0/46字符串,不能匹配0或者46前缀 - 正则语法错误2:
[0-10]是非法的字符集写法,字符集仅支持单个字符的范围匹配,你想匹配0-9的数字应该用[0-9]或者\d,你的写法会导致正则只能匹配0和1两个数字,自然无法识别末尾的9 - 正则规则不符:注释要求前缀之后的第一位是6/7/8/9,但正则写的是
[0-9],没有做范围限制 - 匹配效率问题:正则没有加
^和$限制首尾,容易出现部分匹配,后续用m.group().equals(phone)的判断冗余且效率低
修复后完整代码
/** * @param phone * @return 符合规则的有效手机号 * 支持的号码格式: * 1. 10位手机号:首位为6/7/8/9,后续9位为0-9 * 2. 11位手机号:以0开头,后续10位符合上述10位规则 * 3. 12位手机号:以46开头,后续10位符合上述10位规则 */ public static boolean isValidPhoneNumber(String phone) { phone = trimPhoneNumber(phone); if (TextUtils.isEmpty(phone)) { return false; } Pattern p = Pattern.compile("^(0|46)?[6-9][0-9]{9}$"); return p.matcher(phone).matches(); } public static String trimPhoneNumber(String phone) { if (TextUtils.isEmpty(phone)) { return phone; } else { try { phone = phone.replaceAll("[^0-9]", ""); return phone; } catch (Exception e) { e.printStackTrace(); return phone; } } }
内容的提问来源于stack exchange,提问作者Niklas
相关产品推荐
相关产品推荐

