如何用libphonenumber Java SDK获取手机号的运营商数字前缀
使用libphonenumber获取手机号运营商数字前缀
libphonenumber没有直接返回运营商数字前缀的API,但可以通过解析号码元数据的方式提取,具体实现如下:
核心思路
利用libphonenumber内置的号码元数据(包含各国运营商的号码前缀范围),解析目标号码后,匹配对应地区的移动号码前缀规则,提取出数字形式的运营商前缀。
代码示例
import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber; import com.google.i18n.phonenumbers.metadata.PhoneNumberMetadata; import com.google.i18n.phonenumbers.metadata.RangeTree; public class CarrierPrefixGetter { public static void main(String[] args) throws Exception { // 初始化工具类 PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); // 解析目标手机号(替换成你需要处理的号码) Phonenumber.PhoneNumber numberProto = phoneUtil.parse("+375445111111", ""); // 获取号码所属地区的元数据 String regionCode = phoneUtil.getRegionCodeForNumber(numberProto); PhoneNumberMetadata metadata = phoneUtil.getMetadataForRegion(regionCode); if (metadata != null && metadata.getMobile() != null) { // 获取该地区移动号码的前缀范围树 RangeTree mobileRanges = metadata.getMobile().getNumberRanges(); // 获取号码的国内有效部分 String nationalNum = phoneUtil.getNationalSignificantNumber(numberProto); // 遍历前缀范围,匹配当前号码对应的运营商前缀 mobileRanges.asRanges().forEach(range -> { String start = String.valueOf(range.getStart()); String end = String.valueOf(range.getEnd()); // 计算当前前缀范围的公共前缀长度 int prefixLen = start.length() - (end.length() - start.length()); String carrierPrefix = start.substring(0, prefixLen); // 判断当前号码是否匹配该前缀范围 if (nationalNum.startsWith(carrierPrefix)) { // 输出两种格式的前缀:不含国家码、含国家码 System.out.println("运营商前缀(不含国家码):" + carrierPrefix); System.out.println("运营商前缀(含国家码):" + numberProto.getCountryCode() + carrierPrefix); } }); } } }
注意事项
- 不同国家的运营商前缀长度差异较大,比如中国手机号前缀是3位,部分欧洲国家是2位,需根据目标地区的规则调整前缀提取逻辑
- 若同一运营商对应多个前缀段,代码会输出所有匹配的前缀,可根据需求做去重或筛选
- 仅针对移动号码生效,如需处理固定电话运营商前缀,需将
metadata.getMobile()替换为metadata.getFixedLine()等对应类型
内容的提问来源于stack exchange,提问作者degr
相关产品推荐
相关产品推荐

