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

2021-08-25 10:40:20 字數 2668 閱讀 1807

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

手機號碼格式比較固定,無非是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**示例

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

private const string telmatchstr = @"^(?《國家**》(/+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)?$";

private static readonly regex mobilematchregex = new regex(mobilematchstr, regexoptions.compiled | regexoptions.singleline | regexoptions.ignorecase | regexoptions.ignorepatternwhitespace);

private static readonly regex telmatchregex = new regex(telmatchstr, regexoptions.compiled | regexoptions.singleline | regexoptions.ignorecase | regexoptions.ignorepatternwhitespace);

private static bool ismobile(string text)

private static bool istel(string text)

小結:這裡僅僅對**號碼作了乙個基本的篩選,避免了諸如1234567890123的非法號碼,但是對於支援**號碼格式的智慧型程度有限,比如不去區分四位**號碼是否存在。

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

最近碰到了這樣乙個需求,提交標單的時候判斷使用者 國內 是否在輸入框輸入了正常的手機或者 座機號碼。手機號碼格式比較固定,無非是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程式...