号码段地址正则表达式
如上图咱们能够根据不一样运营商的号码段来编写正则,也能够进行统一校验的编写,我这边主要是编写统一校验的。编程
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"); }
排序结果:缓存
13开头:
130 131 132
133 134 135 136 137 138 139
对应正则为:(13[0-9]\d{8})工具
14开头:145 147 对应正则为:(14[57]\d{8})性能
15开头:
150 151 152
153 155 156 157 158 159
对应正则为:(15[0-35-9]\d{8})优化
17开头:173 176 177 178 对应正则 为:(17[36-8]\d{8})spa
18开头:180 181 182 183 184 185 186 187 188 189
对应正则为:(18[0-9]\d{8})3d
170开头:1700 1705 1707 1708 1709 对应正则为:(170[057-9]\d{7})code
(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})blog
但此时,咱们仍是能够看出一些规律能够来简化这个正则表达式,相似初中数学的合并同类项,把\d{8}提取出来,简化为:
((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d{8}|(170[057-9]\d{7})
为了更明显的查看分组,咱们能够用分组括号把((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d{8}包含起来,变为:
(((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d{8})
因而,完整的正则就变为了:
(((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d{8})|(170[057-9]\d{7})
上面这个正则表达式已经能够投入编程使用了,但这个这个正则表达式分组有点多,获取捕获组的个数:
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})
此时在RegexBuddy正则工具上能够看到0个分组
最终咱们获得的正则表达式为
(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))\d{8})|(?:170[057-9]\d{7})
如果要匹配开头和结尾的话,改成
^(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))\d{8})|(?:170[057-9]\d{7})$
固然,若是不须要准确校验的话,其实能够这么写就够了,以下:^1\d{10}$