验证手机号码格式的正则表达式编写思路详解
一、获取目前中国三大运营商的手机号码段号码段地址 如上图我们可以根据不同运营商的号码段来编写正则,也可以进行统一校验的编写,我这边主要是编写统一校验的。 二、思路1、为了得到号码段的规律,我们可以把它们先进行排序一下,排序代码如下:int[] phoneHead={134,135,136,137,138,139,182,183,187,188,152,157,158,159,150,147,184,151,178,1705,130,131,132,155,156,186,145,185,1709,1707,1708,176,133,153,180,181,189,177,1700,173}; Arrays.sort(phoneHead); for(int head:phoneHead){ System.out.print(head+"t"); } 排序结果: 2、由上面的排序结果可以看出,规律还是挺明显的,首先我们来看一下13开头: 14开头:145 147 对应正则为:(14[57]d{8}) 15开头: 17开头:173 176 177 178 对应正则 为:(17[36-8]d{8}) 18开头:180 181 182 183 184 185 186 187 188 189 170开头:1700 1705 1707 1708 1709 对应正则为:(170[057-9]d{7}) 3、把上面的正则用或符号(|)拼在一起,就是一个完整的校验手机号的正则表达式了,如下(13[0-9]d{8})|(14[57]d{8})|(15[0-35-9]d{8})|(17[36-8]d{8})|(18[0-9]d{8})|(170[057-9]d{7}) 但此时,我们还是可以看出一些规律可以来简化这个正则表达式,类似初中数学的合并同类项,把d{8}提取出来,简化为: 4、优化上面这个正则表达式已经可以投入编程使用了,但这个这个正则表达式分组有点多,获取捕获组的个数: String regex="(((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))d{8})|(170[057-9]d{7})"; Matcher m=Pattern.compile(regex).matcher(""); System.out.println(m.groupCount()); 可以得到8个分组,但如果我们只是用来校验的话,直接用非捕获组就可以了,这样可以提高一些性能。 改为非捕获组后,正则变为:(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))d{8})|(?:170[057-9]d{7}) 5、结果最终我们得到的正则表达式为 若是要匹配开头和结尾的话,改为 当然,如果不需要准确校验的话,其实可以这么写就够了,如下:^1d{10}$ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |