使用正規表示式判斷合法的電話號碼

2021-06-01 08:47:23 字數 2191 閱讀 1466

最近碰到了這樣乙個需求,提交標單的時候判斷使用者(國內)是否在輸入框輸入了正常的手機或者**座機號碼。

手機號碼格式比較固定,無非是13x ***x ***x或者15x ***x ***x再或者18x ***x ***x的格式。座機就比較麻煩,比如長途區號變長(3位或者4位)**號碼變長(7位或者8位)有些還需要輸入分機號。 

通常可以看到解決這個複雜問題的解決方案是手機號和座機號分開。座機號拆分成三段,區號,**號碼+分機號。但是為了表單看起來清爽,設計的時候給了乙個「萬能」的輸入框,給使用者輸入**號碼或者手機號碼。 

在這樣的乙個需求的大前提下,用複雜的正規表示式解決驗證的問題是一種快速的解決方案。 

首先搞定最容易的手機號碼

因為目前開放的號段是130-139, 150-159, 185-189, 180 (參見 我們可以給出這樣乙個初步的正規表示式匹配串:(?《手機號》((13[0-9])|(15[0-9])|(18[0,5-9]))+\d)。 

接下來有人可能會在輸入手機號的時候寫成+8613*********或者(+86)13*********的形式,因此為了支援一下這一模擬較少見的寫法,我們可以新增上國家**的字首:(?《國家**》(\+86)|(\(\+86\)))?。

把前後串拼起來就是:^(?《國家**》(\+86)|(\(\+86\)))?(?《手機號》((13[0-9])|(15[0-9])|(18[0,5-9]))+\d)$。 

然後我們來搞定座機號碼

這個表示式寫起來相當的繁瑣,我們一步一步地拼接吧。

同樣,國家**:(?《國家**》(\+86)|(\(\+86\)))? 

三位區號的部分

010, 021-029,852(香港)

因為採用三位區號的地方都是8位**號碼,因此可以寫成

(010|021|022|023|024|025|026|027|028|029|852)\d

當然不會這麼簡單,有些人習慣(010) ******xx的格式,我們也要支援一把,把以上表示式公升級成

(?《三位區號》((010|021|022|023|024|025|026|027|028|029|852)|(\(010\)|\(021\)|\(022\)|\(023\)|\(024\)|\(025\)|\(026\)|\(027\)|\(028\)|\(029\)|\(852\)))\d?\d

長了許多

再看4位區號的城市

(?《四位區號》(0[3-9][1-9])|(\(0[3-9][1-9]\)))\d?\d)

這裡簡單判斷了不可能存在0111或者0222的區號,以及**號碼是7位或者8位。

最後是分機號

(?《分機號》\d?\d)? 

以上拼裝起來就是:

^(?《國家**》(\+86)|(\(\+86\)))?\d?(?《**號碼》(?《三位區號》((010|021|022|023|024|025|026|027|028|029|852)|(\(010\)|\(021\)|\(022\)|\(023\)|\(024\)|\(025\)|\(026\)|\(027\)|\(028\)|\(029\)|\(852\)))\d?\d|(?《四位區號》(0[3-9][1-9])|(\(0[3-9][1-9]\)))\d?\d))(?《分機號》\d?\d)?$

基本上沒法理解了……

順便給出csharp**示例

privateconststringmobilematchstr =@"^(?《國家**》(\+86)|(\(\+86\)))?(?《手機號》((13[0-9])|(15[0-9])|(18[0,5-9]))+\d)$";

privateconststringtelmatchstr =@"^(?《國家**》(\+86)|(\(\+86\)))?\d?(?《**號碼》(?《三位區號》((010|021|022|023|024|025|026|027|028|029|852)|(\(010\)|\(021\)|\(022\)|\(023\)|\(024\)|\(025\)|\(026\)|\(027\)|\(028\)|\(029\)|\(852\)))\d?\d|(?《四位區號》(0[3-9][1-9])|(\(0[3-9][1-9]\)))\d?\d))(?《分機號》\d?\d)?$";

使用正規表示式判斷合法的電話號碼

最近碰到了這樣乙個需求,提交標單的時候判斷使用者 國內 是否在輸入框輸入了正常的手機或者 座機號碼。手機號碼格式比較固定,無非是13x x x或者15x x x再或者18x x x的格式。座機就比較麻煩,比如長途區號變長 3位或者4位 號碼變長 7位或者8位 有些還需要輸入分機號。通常可以看到解決這...

判斷顏色是否合法的正規表示式

0 9a fa f 0 9a fa f 意思是 以 開頭,後面是數字和a f的字元 大寫或小寫 這個值是6位或3位。要匹配乙個3為是為了符合css顏色的簡寫規則 abc aabbcc 注意 如果需要進行16位和10位的轉換,比如將顏色值轉成int存在資料庫,如果是6位的顏色沒問題,如果是3位的顏色就...

判斷顏色是否合法的正規表示式 詳解

0 9a fa f 0 9a fa f qiwvde 意思是 以 開頭,後面是數字和www.cppcns.coma f的字元 大寫或小寫 這個值是6位或3位。要匹配乙個3為是為了符合css顏色的簡寫規則 abc aabbcc 注意 如果需要進行16位和10位的轉換,比如將顏色qiwvde值轉成i程式...