使用正则表达式判断合法的电话号码
最近碰到了這樣一個需求,提交標單的時候判斷用戶(國內)是否在輸入框輸入了正常的手機或者電話座機號碼。
?
手機號碼格式比較固定,無非是13x xxxx xxxx或者15x xxxx xxxx再或者18x xxxx xxxx的格式。座機就比較麻煩,比如長途區號變長(3位或者4位)電話號碼變長(7位或者8位)有些還需要輸入分機號。
?
通常可以看到解決這個復雜問題的解決方案是手機號和座機號分開。座機號拆分成三段,區號,電話號碼+分機號。但是為了表單看起來清爽,設計的時候給了一個“萬能”的輸入框,給用戶輸入電話號碼或者手機號碼。
?
在這樣的一個需求的大前提下,用復雜的正則表達式解決驗證的問題是一種快速的解決方案。
?
首先搞定最容易的手機號碼
因為目前開放的號段是130-139, 150-159, 185-189, 180 (參見http://blog.chinaunix.net/u2/82549/showart_1894146.html), 我們可以給出這樣一個初步的正則表達式匹配串:(?<手機號>((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\d{8})。
?
接下來有人可能會在輸入手機號的時候寫成+8613xxxxxxxxx或者(+86)13xxxxxxxxx的形式,因此為了支持一下這一類比較少見的寫法,我們可以添加上國家代碼的前綴:(?<國家代碼>(\+86)|(\(\+86\)))?。
?
把前后串拼起來就是:^(?<國家代碼>(\+86)|(\(\+86\)))?(?<手機號>((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\d{8})$。
?
然后我們來搞定座機號碼
?
這個表達式寫起來相當的繁瑣,我們一步一步地拼接吧。
?
同樣,國家代碼:(?<國家代碼>(\+86)|(\(\+86\)))?
?
三位區號的部分
010, 021-029,852(香港)
因為采用三位區號的地方都是8位電話號碼,因此可以寫成
(010|021|022|023|024|025|026|027|028|029|852)\d{8}
當然不會這么簡單,有些人習慣(010) xxxxxxxx的格式,我們也要支持一把,把以上表達式升級成
(?<三位區號>((010|021|022|023|024|025|026|027|028|029|852)|(\(010\)|\(021\)|\(022\)|\(023\)|\(024\)|\(025\)|\(026\)|\(027\)|\(028\)|\(029\)|\(852\)))\D?\d{8}
長了許多
?
再看4位區號的城市
(?<四位區號>(0[3-9][1-9]{2})|(\(0[3-9][1-9]{2}\)))\D?\d{7,8})
這里簡單判斷了不可能存在0111或者0222的區號,以及電話號碼是7位或者8位。
?
最后是分機號
(?<分機號>\D?\d{1,4})?
?
以上拼裝起來就是:
^(?<國家代碼>(\+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{8}|(?<四位區號>(0[3-9][1-9]{2})|(\(0[3-9][1-9]{2}\)))\D?\d{7,8}))(?<分機號>\D?\d{1,4})?$
?
基本上沒法理解了……
?
順便給出CSharp代碼示例
private const string MobileMatchStr = @"^(?<國家代碼>(\+86)|(\(\+86\)))?(?<手機號>((13[0-9]{1})|(15[0-9]{1})|(18[0,5-9]{1}))+\d{8})$";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{8}|(?<四位區號>(0[3-9][1-9]{2})|(\(0[3-9][1-9]{2}\)))\D?\d{7,8}))(?<分機號>\D?\d{1,4})?$";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){return MobileMatchRegex.IsMatch(text);}private static bool IsTel(string text){return TelMatchRegex.IsMatch(text);}?
?
小結:
這里僅僅對電話號碼作了一個基本的篩選,避免了諸如1234567890123的非法號碼,但是對于支持電話號碼格式的智能程度有限,比如不去區分四位電話號碼是否存在。
轉載于:https://www.cnblogs.com/powertoolsteam/archive/2010/10/09/1846808.html
總結
以上是生活随笔為你收集整理的使用正则表达式判断合法的电话号码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python倒计时代码turtle,Py
- 下一篇: 百数返乡登记表上线,支持返乡防疫工作