ITKeyword,专注技术干货聚合推荐

注册 | 登录

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

powertoolsteam 分享于 2010-10-11

推荐:验证电话号码的正则表达式

1,这种是比较简单的验证号码: 电话号码只能包含”(“、“)”、“-”和数字 <input   type=text   onkeyup="value=value.replace(/[^\0-9.-]/g,'');">   也适

2018阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

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

 

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

推荐:iOS 开发: 用户名、邮箱、电话号码、密码、昵称正则表达式验证

用户名验证: + (BOOL) validateUserName:(NSString *)name{ NSString *userNameRegex = @"^[A-Za-z0-9]{6,20}+$"; NSPredicate *userNamePredicate =

因为采用三位区号的地方都是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-9]{2,3}\-)([2-9][0-9]{6,7})+(\-[0-9]{1,4})$)|(^((\(\d{3}\))|(\d{3}\-))(1[358]\d{9})$)/

最近碰到了这样一个需求,提交标单的时候判断用户(国内)是否在输入框输入了正常的手机或者电话座机号码。   手机号码格式比较固定,无非是13x xxxx xxxx或者15x xxxx xxxx再或者18x xxxx xxxx

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。