java校验手机号码、固定电话的合法性

一、规则说明

1、全国固定电话区号大体分两种,三位数和四位数(400固话除外)
中国电话区号三位数有十大城市。分别为:
北京市010
广州市020
上海市021
天津市022
重庆市023
沈阳市024
南京市025
武汉市027
成都市028
西安市029
2、移动电话由于国家的手机号码前三位在不断更新,目前移动、联通、电信三大运营商的手机号段大致如下:
移动号段有134,135,136,137,138,139,147,150,151,152,157,158,159,178,182,183,184,187,188。
联通号段有130,131,132,155,156,185,186,145,176。
电信号段有133,153,177,180,181,189。
中国使用的手机号码为11位,其中各段有不同的编码方向:前3位———网络识别号;第4-7位———地区编码;第8-11位———用户号码

二、工具类

import android.content.Context;
import android.text.TextUtils;
import android.widget.Toast;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 类说明:手机号、固定电话合法性校验
 */

public class PhoneValidatorUtil {

    public static boolean matchPhone(String number, int type){
        if (TextUtils.isEmpty(number)) {
            return false;
        }
        if (type == 0) {
            Matcher m = null;
            Pattern p = Pattern.compile("^[0][1-9]{2,3}-[0-9]{5,10}$");  // 验证带区号的,中间有"-"
            //p = Pattern.compile("^[1-9]{1}[0-9]{5,8}$");         // 验证没有区号的
            m = p.matcher(number);
            return m.matches();
        } else {
            //符合返回true
            if (Pattern.matches("^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9]|17[0|6|7|8])\\d{8}$", number)) {
                return true;
            }
        }
        return false;
    }

    /**
     *
     * @param context
     * @param number
     * @param type 0 固话 1 手机号
     * @return
     */
    public static boolean matchPhoneShowToast(Context context, String number, int type){
        boolean flag = matchPhone(number, type);
        if (!flag){
            Toast.makeText(context, type == 0 ? "固定电话格式错误" : "移动电话格式错误!",
                    Toast.LENGTH_SHORT).show();
        }
        return flag;
    }
}

该工具类目前支持13、14、15、17、18开头的号码,基本能支持目前市面上所有的手机号码,后期如有新号段,需再完善,以下为测试用例

//      String number = "0557-5033061";
//      String number = "021-62963636";
        String number = "029-86261199";
        if (PhoneValidatorUtil.matchPhoneShowToast(this, number, 0)){
            Log.i("TAG", "固定电话校验成功!");
        } else {
            Log.i("TAG", "固定电话校验失败!");
        }
        String phone = "14755296414";
        if (PhoneValidatorUtil.matchPhoneShowToast(this, phone, 1)){
            Log.i("TAG", "移动电话校验成功!");
        } else {
            Log.i("TAG", "移动电话校验失败!");
        }
### 手机号码正则表达式校验的实现方式 手机号码正则表达式校验是一种常见的输入验证手段,用于确保用户输入的手机号码符合指定的标准。根据最新的号段规则和 Java 编程实践,以下是详细的实现方法。 #### 正则表达式的定义 基于当前主流运营商(中国移动、中国联通、中国电信)以及虚拟运营商的号段分布,可以设计以下两种常用的正则表达式: 1. **简单版正则表达式** 适用于大多数常规场景下的手机号码校验。 ```java "^1[3|4|5|7|8][0-9]\\d{8}$" [^2] ``` - 开头固定为 `1`。 - 第二位数字限定为 `[3, 4, 5, 7, 8]`。 - 后续八位为任意数字。 2. **增强版正则表达式** 提供更加严格的匹配规则,覆盖具体的号段范围。 ```java "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$" [^2] ``` - 明确指定了各个运营商的具体号段。 - 支持更多细分号段,例如 `145/147`(无线上网卡)、`170/171`(虚拟运营商)等。 --- #### 实现代码示例 以下是一个完整的 Java 方法实现手机号码的正则校验功能: ```java import java.util.regex.Pattern; public class MobileValidator { private static final String SIMPLE_REGEX = "^1[3|4|5|7|8][0-9]\\d{8}$"; [^2] private static final String STRICT_REGEX = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"; [^2] /** * 判断手机号是否合法 * * @param mobile 待校验的手机号 * @return true 表示合法,false 表示非法 */ public static boolean isMobile(String mobile) { if (mobile == null || mobile.length() != 11) { return false; } Pattern pattern = Pattern.compile(STRICT_REGEX); [^2] return pattern.matcher(mobile).matches(); } public static void main(String[] args) { String testNumber = "13919190810"; boolean isValid = isMobile(testNumber); if (isValid) { System.out.println("手机号符合规则。"); } else { System.out.println("这个号码不符合规则。"); } } } ``` --- #### 说明 1. 上述代码中提供了两个正则表达式选项:`SIMPLE_REGEX` 和 `STRICT_REGEX`。可以根据实际需求选择合适的版本。 2. 在 `isMobile` 方法中,先判断手机号长度是否为 11 位,再利用正则表达式进一步验证其合法性。 3. 测试用例展示了如何调用该方法并对结果进行打印输出。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值