You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:25:20