號碼段位址
如上圖我們可以根據不同運營商的號碼段來編寫正則,也可以進行統一校驗的編寫,我這邊主要是編寫統一校驗的。
int phonehead=;
arrays.sort(phonehead);
for(int head:phonehead)
排序結果:
13開頭:
130 131 132
133 134 135 136 137 138 139
對應正則為:(13[0-9]\d)
14開頭:145 147 對應正則為:(14[57]\d)
15開頭:
150 151 152
153 155 156 157 158 159
對應正則為:(15[0-35-9]\d)
17開頭:173 176 177 178 對應正則 為:(17[36-8]\d)
18開頭:180 181 182 183 184 185 186 187 188 189
對應正則為:(18[0-9]\d)
170開頭:1700 1705 1707 1708 1709 對應正則為:(170[057-9]\d)
(13[0-9]\d)|(14[57]\d)|(15[0-35-9]\d)|(17[36-8]\d)|(18[0-9]\d)|(170[057-9]\d)
但此時,我們還是可以看出一些規律可以來簡化這個正規表示式,類似初中數學的合併同類項,把\d提取出來,簡化為:
((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d|(170[057-9]\d)
為了更明顯的檢視分組,我們可以用分組括號把((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d包含起來,變為:
(((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d)
於是,完整的正則就變為了:
(((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\d)|(170[057-9]\d)
上面這個正規表示式已經可以投入程式設計使用了,但這個這個正規表示式分組有點多,獲取捕獲組的個數:
string regex="(((13[0-9])|(14[57])|(15[0-35-9])|(17[36-8])|(18[0-9]))\\d)|(170[057-9]\\d)";
matcher m=pattern.compile(regex).matcher("");
system.out.println(m.groupcount());
改為非捕獲組後,正則變為:(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))\d)|(?:170[057-9]\d)
此時在regexbuddy正則工具上可以看到0個分組
最終我們得到的正規表示式為
(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))\d)|(?:170[057-9]\d)
若是要匹配開頭和結尾的話,改為
^(?:(?:(?:13[0-9])|(?:14[57])|(?:15[0-35-9])|(?:17[36-8])|(?:18[0-9]))\d)|(?:170[057-9]\d)$
當然,如果不需要準確校驗的話,其實可以這麼寫就夠了,如下:
^1\d$
手機號碼正規表示式
匹配手機號碼的正規表示式 13 0 9 14 5,7 15 0 3,5 9 17 0,3,5 8 18 0 9 166 198 199 147 d 判斷是否是手機號 param mobile return public static boolean ismobile string mobile 代表...
使用正規表示式驗證手機號碼
開發工具與關鍵技術 vs2015 正規表示式function checkphone phone if ab.test phone false returnfalse 如上 所示,我們寫了乙個方法驗證手機號碼,其實就是乙個正規表示式,它規定第一位數字輸入的必須是1,第二位數字輸入的必須是3,4,5,7...
手機號碼驗證正規表示式js
function ismobel value g.test value else 表示式分析 代表乙個正規表示式。代表字串的開始位置,代表字串的結束位置。代表匹配前面的字元乙個或零個,所以這裡0?的意思是手機號碼可以以0開頭或不以0開頭。接下的部分驗證11位的手機號碼,先從13開始,因為從130 1...