`

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

阅读更多

(转)

手机号码格式比较固定,无非是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使用正则表达式针对手机号的匹配操作实现技巧。下面是文章中提到的知识点: 1. 手机号码...

    java 使用正则表达式验证电话号码的格式

    java 使用正则表达式验证电话号码的格式 java 使用正则表达式验证电话号码的格式

    java 最新手机号码、电话号码正则表达式

    最新手机号码、电话号码正则表达式

    正则表达式在数据库查询中的应用

    - **兼容性问题**:不同的数据库系统支持的正则表达式语法可能存在差异,需要根据所使用的数据库类型调整正则表达式的写法。 - **安全性问题**:在用户输入的数据中使用正则表达式时,应注意防止SQL注入攻击,确保...

    正则表达式 Java 判断字串是否合理

    对于手机号码的验证,文件中的`checkMobile`方法使用了较为简单的正则表达式: ```java "^[1][3,5]+\\d{9}" ``` 此表达式假设手机号码以1开头,接着是3或5,后面跟着9位数字。实际上,现代中国的手机号码前两位可能...

    正则表达式判断手机号码

    本话题将深入探讨如何使用正则表达式来判断手机号码的合法性。 在中国,手机号码通常遵循11位数字的格式,且以1开头,具体分为三段:前三位是网络提供商代码(如139、158等),中间四位是地区代码,最后四位是用户...

    C#实现正则表达式判断

    本项目"**C#实现正则表达式判断**"主要探讨了如何在C#中使用正则表达式进行模式匹配和验证。 首先,我们需要了解正则表达式的基础概念。正则表达式是由字符和特殊符号组成的字符串,这些字符和符号代表了一组可能的...

    正则表达式判断手机邮箱

    在IT行业中,正则表达式被广泛应用于数据验证、文本处理、爬虫程序等领域,特别是在判断手机号码和邮箱地址的合法性时显得尤为重要。 手机号码的正则表达式通常要考虑不同国家的格式,但以中国大陆为例,常见的11位...

    电话号码及日期时间提取(正则表达式 C)

    在本项目中,“电话号码及日期时间提取(正则表达式 C)”是一个使用C语言编写的程序,它能够从文本中有效地识别和提取中国大陆的手机号码和固定电话号码,以及简体中文网页中的日期和时间信息。 首先,我们要理解...

    powerbuilder正则表达式,取字符串

    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,...

    Java正则表达式验证固定电话号码符合性

    Java正则表达式验证固定电话号码符合性是验证固定电话号码是否合法的重要步骤。通过使用Java正则表达式,可以实现固定电话号码的验证,确保输入的电话号码符合标准格式。本文将详细介绍Java正则表达式验证固定电话...

    c#使用正则表达式验证电话号码

    本示例主要讲解如何使用C#的正则表达式来验证电话号码的格式,确保输入的数据符合预设的规则。电话号码的格式可能因国家和地区而异,但通常包含数字和特定的分隔符。 首先,我们需要了解电话号码的一般模式。在中国...

    js_正则表达式全攻略

    **解决方案**:使用正则表达式 `/\d+$/g` 进行匹配。 - `\d` 表示匹配任意数字。 - `+` 表示匹配前面的元素一次或多次。 - `$` 表示匹配字符串的结尾。 - `g` 是全局匹配标志,表示在整个字符串范围内查找所有匹配...

    正则表达式判断用户信息

    例如,美国电话号码的格式可能是`(XXX) XXX-XXXX`,我们可以用以下正则表达式进行验证: ```java String phoneRegex = "^\\(\\d{3}\\) \\d{3}-\\d{4}$"; ``` 这个表达式匹配以括号包围的3位区号,空格,3位本地...

    正则表达式列举 代码 项目中直接使用

    在项目中直接使用正则表达式可以极大地提高代码的效率和可读性。以下是对给定文件中的正则表达式知识点的详细解析: ### 1. 匹配中文字符 正则表达式:`[\u4e00-\u9fa5]` 此表达式用于匹配中文字符,其中`\u4e00`...

    使用正则表达式验证小写字母

    在实际应用中,正则表达式不仅可以用来验证小写字母,还可以处理各种复杂的文本匹配任务,如邮箱格式验证、电话号码格式验证等。学习和熟练掌握正则表达式对于提升编程技能和提高工作效率具有重要意义。 在提供的`...

    wps正则表达式 以及 wps通过正则表达式验证手机号码

    在WPS 2020及后续版本中,这一特性使得用户能够利用正则表达式处理数据,比如验证手机号码的合法性。 首先,让我们了解什么是正则表达式。正则表达式(Regular Expression)是一种模式匹配语言,它由一系列字符和...

    电话号码正则表达式的写法

    这是自己写的一个电话号码的正则表达式判断,挺好用的

Global site tag (gtag.js) - Google Analytics