用 libphonenumber 把任意写法的电话号码解析、校验并格式化 用 libphonenumber 把任意写法的电话号码解析、校验并格式化【免费下载链接】libphonenumberGoogles common Java, C and JavaScript library for parsing, formatting, and validating international phone numbers.项目地址: https://gitcode.com/GitHub_Trending/li/libphonenumberlibphonenumber 是 Google 维护的开源电话号码解析与验证库提供 Java、C、JavaScript 三套实现内置 200 多个国家和地区的号码规则。它能解析带空格、横杠甚至前导 0 的号码输出标准 E164 结构判断号码是否合法查询号段归属地还能从一段杂乱文本里把号码挑出来。读完本文你可以把注册表单、客服工单、数据清洗这几类场景里的号码处理逻辑接进自己的项目。想先跑通再细看可直接克隆源码git clone https://gitcode.com/GitHub_Trending/li/libphonenumber先解决第一步把杂乱输入解析成标准结构各国用户填号码的方式五花八门61 412 345 678、0412-345-678、(02) 5552 3456后端拿到的往往不是能直接入库的结构。PhoneNumberUtil是 Java 实现里唯一的入口类parse方法负责把原始字符串拆成国家代码 国内号码两部分PhoneNumberUtil phoneUtil PhoneNumberUtil.getInstance(); // 输入 0412 345 678澳洲手机号的本地写法前导 0 是 trunk prefix PhoneNumber number phoneUtil.parse(0412 345 678, AU); // country_code61national_number412345678第二个参数是地区码。用户输入已带国家代码时传ZZ只有国内号码时则必须给出地区码否则库没法判断44 668 18 00到底属于哪个国家。解析失败会抛NumberParseException调用处必须捕获。让同一号码按场景输出不同格式同一个号码数据库里要紧凑的 E164界面里要带空格易读国际短信网关要带号前缀。format方法配合PhoneNumberFormat枚举覆盖这三种需求System.out.println(phoneUtil.format(number, PhoneNumberFormat.E164)); // 61412345678 System.out.println(phoneUtil.format(number, PhoneNumberFormat.NATIONAL)); // 0412 345 678 System.out.println(phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL)); // 61 412 345 678另一种常见场景是边打字边排版用户在表单里敲数字界面实时插入空格。AsYouTypeFormatter就是干这个的每次inputDigit返回当前应显示的完整前缀光标位置也帮你算好AsYouTypeFormatter formatter phoneUtil.getAsYouTypeFormatter(AU); formatter.inputDigit(4); // 4 formatter.inputDigit(1); // 41 formatter.inputDigit(2); // 412 345继续输入后自动分段判断号码是否合法严格和宽松两个档位看起来像号码不等于真的能拨通。isValidNumber按地区规则严格校验是提交表单时的最终关卡isPossibleNumber只检查长度区间更宽松适合输入过程中做即时反馈别一输几位就报无效号码boolean strict phoneUtil.isValidNumber(number); // 完全符合 AU 规则才为 true boolean loose phoneUtil.isPossibleNumber(number); // 长度在合理区间即 true配合getNumberType还能区分手机、固话、短号便于按类型分流提示。规则数据不在代码里而是维护在 metadata/ 目录下按地区更新。查号码归属地离线实现注意它的边界要展示这个号码属于哪座城市PhoneNumberOfflineGeocoder按号段前缀离线查表不需要联网// 输出例如 Sydney号段登记城市 System.out.println(geocoder.getDescriptionForNumber(number, Locale.ENGLISH));注意它返回的是号段登记地不是机主实时位置号段没覆盖到的号码会返回空值界面上要留好兜底文案。从大段文本里批量提取电话号码客服工单、备注字段里常出现有问题打 02 5552 3456 找值班这类文字手动正则很难处理各国区号。findNumbers会自动扫描并跳过粘连在标点旁的误报IterablePhoneNumberMatch matches phoneUtil.findNumbers(text, AU); for (PhoneNumberMatch match : matches) { System.out.println(match.number()); // 逐个输出提取到的号码原文 }接进 Android仓库自带一个现成示例不用从零搭界面java/demoapp/ 下有一个完整示例工程CountryDropdown.java 实现国家选择下拉框MainActivity.java 里就是按选中国家 parse、isValidNumber校验、按 E164 输出这套最小闭环照抄到你的Activity里即可。接下来可以做什么想深入原理主逻辑在 PhoneNumberUtil.java各地区的预期行为在 PhoneNumberUtilTest.java 里都有覆盖规则版本变化见 release_notes.txt。下一步建议给自己的表单接上严格校验 即时反馈两档逻辑再定个季度节奏跟进元数据更新。【免费下载链接】libphonenumberGoogles common Java, C and JavaScript library for parsing, formatting, and validating international phone numbers.项目地址: https://gitcode.com/GitHub_Trending/li/libphonenumber创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考