最近碰到了这样一个需求,提交标单的时候判断用户(国内)是否在输入框输入了正常的手机或者电话座机号码。

手机号码格式比较固定,无非是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

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

  1. 正则表达式判断合法的电话号码

    手机号码格式比较固定,无非是13x xxxx xxxx或者15x xxxx xxxx再或者18x xxxx xxxx的格式.座机就比较麻烦,比如长途区号变长(3位或者4位)电话号码变长(7位或者8位) ...

  2. Android 正则表达式判断手机电话号码是否合法

    1.手机号开头集合 166, 176,177,178 180,181,182,183,184,185,186,187,188,189  145,147   130,131,132,133,134,13 ...

  3. 电话号码正则表达式 代码 javascript+html,JS正则表达式判断11位手机号码

    JavaScript中可以使用正则表达式var myreg=/^[1][3,4,5,7,8][0-9]{9}$/;来判断是否为11位有效电话号码. JavaScript中可以使用正则表达式判断是否为1 ...

  4. ios 判断数字开头_iOS 正则表达式判断纯数字及匹配11位手机号码的方法

    第一种使用正则表达式 判断 //是否是纯数字 + (BOOL)isNumText:(NSString *)str{ NSString * regex = @"(/^[0-9]*$/)&quo ...

  5. php正则表达式判断url,判断url的正则表达式

    判断url的正则表达式判断url的正则表达式 @"^((https|http|ftp|rtsp|mms)?://)" + @"?(([0-9a-z_!~*'().& ...

  6. java 判断手机运营商_JS正则表达式判断手机号所属运营商

    根据用户的输入手机号码判断该号的运营商是移动.联通.电信或其他,再根据不同的运营商做出相应的处理,下面介绍js中如何判断手机号的运营商的代码电话号码是电话管理部门为电话机设定的号码.一般7--8位数组 ...

  7. java 固定电话_Java正则表达式验证固定电话号码符合性

    下面给大家介绍Java正则表达式验证固定电话号码符合性,具体代码如下所示: /** * 验证固定电话号码的合法性 * @author jy */ package phone; import java. ...

  8. java 正则表达式 电话_Java读取文件及基于正则表达式的获取电话号码功能详解...

    本文实例讲述了Java读取文件及基于正则表达式的获取电话号码功能.分享给大家供大家参考,具体如下: 1.正则表达式 正则表达式,又称 正规表示法 . 常规表示法 (英语:Regular Express ...

  9. 用正则表达式判断一个二进制数是否能被3整除

    我们之前已经见过了正则表达式的一些很特殊的用法.这里我们再来看一个:用正则表达式判断数的整除性.例如,下面这个表达式可以匹配01串S当且仅当S是一个可以被3整除的二进制数. ^1((10*1)|(01 ...

最新文章

  1. vmware workstation 安装esx 启动vt功能
  2. VMware vSphere简介
  3. 如何机智的弄坏一台电脑?
  4. Delta3d角色注册机制
  5. 百度SEO emlog博客lu1.3模板
  6. 擦地机器人排行榜_擦地机器人品牌排行榜来了,你想了解的都在这里
  7. 9.使用 curses 函数库来管理基于文本的屏幕
  8. linux中ftp禁止匿名,linux下禁止root和匿名用户登录ftp
  9. 如何快速开通微信商户现金红包
  10. Python excel数据处理之公式---openpyxl
  11. Firebug教你玩转网页小把戏!
  12. Guzzle中的异步请求
  13. html实现点赞效果,HTML+CSS入门 点赞功能实现 $(tag).css('属性', '样式')
  14. Python之pip升级命令
  15. java面试题----选择题02
  16. Unity3d中的人物移动
  17. 判断字符串是不是回文
  18. Docker Desktop(WSL2)修改镜像存储位置
  19. Windows系统中 UltraEdit 下载安装
  20. 【STM32F429】RT-Thread结合TouchGFX实战教程

热门文章

  1. Microsoft Office For Mac
  2. 电脑端与iPad 端如何共享ChemDraw结构
  3. ssr面板_阴阳师:最新SSR鬼切面板、技能详解,普攻和被动就可秒杀全场!
  4. 学了一年Java的我,想转嵌入式了
  5. flex弹性盒子模型
  6. uniapp 打包安装(安卓和ios)
  7. 全球及中国手持式射频识别阅读器行业研究及十四五规划分析报告
  8. 飞桨领航团厦门沈阳北京回顾 | 打开技术沙龙的另一种方式
  9. iOS 网络权限弹框处理
  10. Abusing Phone Numbers and Cross-application Features for Crafting Targeted Attacks