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"));
    }
}


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

目录
相关文章
|
2天前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
25 9
|
1月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
37 8
|
1月前
|
API
查询城市手机号段免费API接口教程
此API用于查询指定城市的手机号段、服务商、区号、邮编等信息。支持POST或GET请求,需提供用户ID、KEY及城市名称等参数。返回数据包括状态码、信息提示、查询数量、最大页码、当前页码、省份、城市、区号、邮编、区划代码及数据集等。示例中提供的ID和KEY为公共测试用,建议使用个人ID和KEY以获得更高的调用频率。
|
1月前
|
API
手机号段查询城市免费API接口教程
此接口用于根据手机号段查询相关信息,包括城市、运营商、区号等。支持POST和GET请求,需提供用户ID、KEY及手机号段前7位作为参数。返回数据包含状态码、信息提示及详细归属信息。示例请求地址:https://cn.apihz.cn/api/ip/haoduan.php?id=88888888&key=88888888&numbers=1321993。接口免费,建议使用个人ID与KEY以独享调用频次。
|
1月前
|
API
查手机号归属地免费API接口教程
此API用于查询指定手机号码的归属地信息,包括号段、省份、城市、运营商等。支持POST和GET请求方式,需提供用户ID、KEY及手机号作为参数。返回结果包含状态码、信息提示及详细归属地信息。示例请求地址:https://cn.apihz.cn/api/ip/shouji.php?id=88888888&key=88888888&phone=13219931963。
|
2月前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
193 6
|
6月前
|
SQL Java API
Java一分钟之-JPA查询:JPQL与Criteria API
【6月更文挑战第14天】本文探讨了Java Persistence API (JPA)中的两种查询方式:JPQL和Criteria API。JPQL是面向对象的SQL,适用于简单查询,而Criteria API则提供类型安全的动态查询构造。文章指出了每种方法的常见问题和避免策略,如混淆实体属性与数据库字段、参数绑定错误、过度复杂化和性能问题。建议开发者根据需求选择适当的方法,并关注查询的可读性、可维护性和性能优化。
81 2
|
2月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
27 1
|
2月前
|
缓存 Java 数据处理
java查询大量数据优化
通过结合的高性能云服务,如其提供的弹性计算资源与全球加速网络,可以进一步增强这些优化策略的效果,确保数据处理环节更加迅速、可靠。蓝易云不仅提供稳定的基础架构,还拥有强大的安全防护和灵活的服务选项,是优化大型数据处理项目不可或缺的合作伙伴。
45 0
|
3月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
40 1