JAVA判断号码是手机还是固话并查询归属地

简介: JAVA判断号码是手机还是固话并查询归属地

引言


最近在做呼叫中心项目,其中有一个环节是根据根据FS传入的 被叫号码来确定使用哪个线路呼叫,我们需要判断被叫号码是手机号码还是固话,并且需要判断号码的归属地, 我们需要把这些参数 传递给规则引擎,然后返回需要的线路。


基本思路


首先 判断被叫号码 是否是手机号,如果是手机号则返回前7位 用来做归属地查询,如果是固话返回区号用来归属地查询。


业务代码:

 //校验被叫号码固话还是手机
        Map<String, String> stringMap = PhoneUtils.checkNumber(callObj.getTelNumber());
        if (RobotConstants.PHONE_TYPE_INVALID_PHONE.equals(stringMap.get("phoneType"))) {
            callObj.setFailedReason("无效的手机号");
            return null;
        }
        //归属地
        String telAttribute = numberService.getProvinceByTelNumber(stringMap.get("code"));

归属地比较简单了,我们维护了一张表里面存放了固话区号和手机号前7位对应的省、市。


其中checkNumber会返回一个map其中存放了号码类型和code,如果是固话code存放区号,如果是手机号码code存放前7位。


工具类,

package com.jack.common.utils;
import com.jack.common.constant.RobotConstants;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * @Description: 
 * @author: zhenghao
 * @date: 2019/10/18 18:55
*/
public class PhoneUtils {
    /**
     * 用于匹配手机号码
     */
    private final static String REGEX_MOBILEPHONE = "^0?1[34578]\\d{9}$";
    /**
     * 用于匹配固定电话号码
     */
    private final static String REGEX_FIXEDPHONE = "^(010|02\\d|0[3-9]\\d{2})?\\d{6,8}$";
    /**
     * 用于获取固定电话中的区号
     */
    private final static String REGEX_ZIPCODE = "^(010|02\\d|0[3-9]\\d{2})\\d{6,8}$";
    private static Pattern PATTERN_MOBILEPHONE;
    private static Pattern PATTERN_FIXEDPHONE;
    private static Pattern PATTERN_ZIPCODE;
    static {
        PATTERN_FIXEDPHONE = Pattern.compile(REGEX_FIXEDPHONE);
        PATTERN_MOBILEPHONE = Pattern.compile(REGEX_MOBILEPHONE);
        PATTERN_ZIPCODE = Pattern.compile(REGEX_ZIPCODE);
    }
    public static Map<String, String> checkNumber(String number) {
        Map<String, String> map = new HashMap<>();
        String phoneType = null;
        String code = null;
        if (number != null && number.length() > 0) {
            if (isCellPhone(number)) {
                // 如果手机号码以0开始,则去掉0
                if (number.charAt(0) == '0') {
                    number = number.substring(1);
                }
                phoneType = RobotConstants.PHONE_TYPE_CELL_PHONE;
                code = number.substring(0, 7);
            } else if (isFixedPhone(number)) {
                // 获取区号
                String zipCode = getZipFromHomephone(number);
                phoneType = RobotConstants.PHONE_TYPE_FIXED_PHONE;
                code = zipCode;
            } else {
                phoneType = RobotConstants.PHONE_TYPE_INVALID_PHONE;
                code = null;
            }
        }
        map.put("phoneType", phoneType);
        map.put("code", code);
        return map;
    }
    /**
     * 获取固定号码号码中的区号
     *
     * @param strNumber
     * @return
     */
    public static String getZipFromHomephone(String strNumber) {
        Matcher matcher = PATTERN_ZIPCODE.matcher(strNumber);
        if (matcher.find()) {
            return matcher.group(1);
        }
        return null;
    }
    /**
     * 判断是否为手机号码
     *
     * @param number 手机号码
     * @return
     */
    public static boolean isCellPhone(String number) {
        Matcher match = PATTERN_MOBILEPHONE.matcher(number);
        return match.matches();
    }
    /**
     * 判断是否为固定电话号码
     *
     * @param number 固定电话号码
     * @return
     */
    public static boolean isFixedPhone(String number) {
        Matcher match = PATTERN_FIXEDPHONE.matcher(number);
        return match.matches();
    }
    public static void main(String[] args) {
        System.out.println(checkNumber("0101234567"));
        System.out.println(checkNumber("13512312311"));
    }
}


其中工具类中判断手机号的整个,需要我们根据每年新增的手机号规则进行调整。

目录
相关文章
|
3月前
|
安全 API Python
详解手机状态查询API实战指南
手机状态查询API是一款高效接口,可实时识别手机号状态(实号、空号、风险号等),帮助企业筛选有效号码,提升业务触达率与客户体验。
394 0
|
3月前
|
Java Apache 开发者
解决java.lang.IllegalArgumentException: Invalid uri由无效查询引起的问题
最后,当你修改代码以避免这个异常时,保持代码的整洁和可读性同样重要。注释你的代码,用意图清晰的方法名,并确保逻辑简单明了,这样在未来你或其他开发者需要时可以轻松地维护它。
416 20
|
4月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
186 1
|
9月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
339 17
|
SQL Java API
Java一分钟之-JPA查询:JPQL与Criteria API
【6月更文挑战第14天】本文探讨了Java Persistence API (JPA)中的两种查询方式:JPQL和Criteria API。JPQL是面向对象的SQL,适用于简单查询,而Criteria API则提供类型安全的动态查询构造。文章指出了每种方法的常见问题和避免策略,如混淆实体属性与数据库字段、参数绑定错误、过度复杂化和性能问题。建议开发者根据需求选择适当的方法,并关注查询的可读性、可维护性和性能优化。
199 2
|
9月前
|
移动开发 数据安全/隐私保护
ClKLog支持手机端查询统计数据啦!
ClKLog的付费版中提供了兼容移动端的h5展示界面,简单来说,手机浏览器直接访fangwe问统计地址就能直接查询主要的统计数据。
|
9月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
924 6
|
10月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
390 9
|
11月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
132 8
|
11月前
|
API
查询城市手机号段免费API接口教程
此API用于查询指定城市的手机号段、服务商、区号、邮编等信息。支持POST或GET请求,需提供用户ID、KEY及城市名称等参数。返回数据包括状态码、信息提示、查询数量、最大页码、当前页码、省份、城市、区号、邮编、区划代码及数据集等。示例中提供的ID和KEY为公共测试用,建议使用个人ID和KEY以获得更高的调用频率。