使用正则表达式判断合法的电话号码

  最近碰到了这样一个需求,提交标单的时候判断用户(国内)是否在输入框输入了正常的手机或者电话座机号码。
  手机号码格式比较固定,无非是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的非法号码,但是对于支持电话号码格式的智能程度有限,比如不去区分四位电话号码是否存在。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值