(转)
手机号码格式比较固定,无非是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的非法号码,但是对于支持电话号码格式的智能程度有限,比如不去区分四位电话号码是否存在。
分享到:
相关推荐
主要介绍了java使用正则表达式判断手机号的方法,分析了手机号码段的原理及java使用正则表达式针对手机号的匹配操作实现技巧,需要的朋友可以参考下
java 使用正则表达式验证电话号码的格式 java 使用正则表达式验证电话号码的格式
利用正则表达式判断手机号码是否合法,对于一些需要手机验证的app有所帮助
Java正则表达式的使用,判断html、电话等是否符合规定、、、
powerbuilder正则表达式,可以截取不定字符串。如 string ls_text ls_text = ' date of payment: 01.11.2004 ' …… ls_date = lnvo_re.of_getmatch(ls_text) //'01.11.2004' ls_day = lnvo_re.of_getmatch(ls_text,...
c#使用正则表达式验证电话号码,程序可以很好运行,方便大家学习
这是自己写的一个电话号码的正则表达式判断,挺好用的
通过正则表达式的使用,判断用户注册信息中的邮箱、电话、密码信息是否符合要求。
正则表达式列举 项目中用到的 需者下载
主要介绍了Java正则表达式验证固定电话号码符合性的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
RegexApplication/Default.aspx 正则表达式类的应用 RegexApplication/GetPageHtmlData.aspx 获取网页的内容 第10章(/10/) ASPNETValidator/Compare.aspx 比较验证 ASPNETValidator/...
1) Boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。 2) String replaceAll(String regex,String replacement):返回该字符串中所有匹配正则表达式的子串,然后替换成replacement指定的...
电话号码及日期时间提取(采用正则表达式方式的C语言代码) 支持中国大陆区域通用手机号及固定电话号码提取,简体中文文本网页时间提取。
Java正则表达式的使用实例Java正则表达式的使用实例;关于url、电话等字符串的判断
使用正则表达式实现删除字符串中的空格:... 4 限制文本框只能输入数字和小数点等等... 5 替换小数点前内容为指定内容... 5 只匹配中文的正则表达式... 5 返回字符串的中文字符个数... 6 正则表达式取得匹配IP地址前...
使用正则表达式实现删除字符串中的空格:... 4 限制文本框只能输入数字和小数点等等... 5 替换小数点前内容为指定内容... 5 只匹配中文的正则表达式... 5 返回字符串的中文字符个数... 6 正则表达式取得匹配IP地址前...
今天小编就为大家分享一篇关于Java使用正则表达式验证手机号和电话号码的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
本文实例讲述了jquery使用正则表达式验证email地址的方法。分享给大家供大家参考。具体实现方法如下: 复制代码 代码如下:<html> <head> <title>jquery使用正则表达式验证email地址</title>...