前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用正则表达式判断合法的电话号码

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

作者头像
葡萄城控件
发布于 2018-01-10 02:56:44
发布于 2018-01-10 02:56:44
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        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的非法号码,但是对于支持电话号码格式的智能程度有限,比如不去区分四位电话号码是否存在。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-10-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
正则表达式:验证手机和电话号码
写了一个验证手机号和电话号码的正则表达式,在这里存档,以备以后用到。 ^1\d{10}$|^(0\d{2,3}-?|\(0\d{2,3}\))?[1-9]\d{4,7}(-\d{1,8})?$ 规则说
艳艳代码杂货店
2021/10/27
4.3K0
js最新手机号码、电话号码正则表达式
js最新手机号码、电话号码正则表达 正则表达式(regular expression)是一个描述字符模式的对象。使用javascript正则表达式可以进行强大的模式匹配和文本检索与替换功能。 手机号码正则表达式验证。 function checkPhone(){ var phone = document.getElementById('phone').value; if(!(/^1[3|4|5|7|8]\d{9}$/.test(phone))){ alert("手机号码有
用户1219438
2018/02/01
29.5K0
正则表达式匹配身份证 电话号码 邮箱 住宅电话 邮编等
身份证号码的匹配 大陆的居民身份证号码有两种:18位和15位,15位的身份证号码是老一代身份证号码。
大师级码师
2021/10/27
1.3K0
常用正则表达式
我们经常会在项目中用到正则表达式,例如在 邮箱,手机号码验证中都会需要用到 最基础的正则表达式来判断输入的数据是否符合我们的要求,以下是经常会用到的正则表达式:
呆呆
2021/10/07
2560
邮箱、手机号、url等常用正则表达式
常用规则 正则表达式 Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 域名: [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(
小黑同学
2020/11/24
20K0
javascript 手机号码正则表达式验证函数
随着手机号码段的不断增加,以前网上的手机号码验证函数都不能那么完美的支持了,这里脚本之家编辑特为大家准备的一个简单的正则与手机验证的函数分析。
全栈程序员站长
2022/09/30
5010
编码篇 - 正则表达式及其相关
有时我们需要在一大段长文本中过滤出我们需要的字段,或者检验该文本是否符合要求(该文本是否是邮箱,链接,电话号码或身份证),这时候就需要用到正则表达式了,当然我们也可以使用 NSPredicate,这不重要,重要的是表达式对于刷选和逻辑判断来说是十分方便的。
進无尽
2018/09/12
1K0
编码篇 - 正则表达式及其相关
关于常用的正则表达式的分享
  1.正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
用户7053485
2020/03/12
1.2K0
收藏一波:常用正则表达式公式总结
一、校验数字的表达式 数字: ^[0-9]\*$ n位的数字: ^\d{n}$ 至少n位的数字: ^\d{n,}$ m-n位的数字: ^\d{m,n}$ 零和非零开头的数字: ^(0|[1
Java团长
2019/06/14
6950
微信小程序正则表达式
Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
江一铭
2022/06/17
9610
C# 正则表达式大全「建议收藏」
在网上看到一个不错的简易版正则匹配和替换的工具,现在补充进来,感觉还不错,效果如下(输入验证中文汉字的正则表达式)
全栈程序员站长
2022/09/06
1.7K0
C# 正则表达式大全「建议收藏」
基本正则表达式的运用【前端】
关于正则表达式一直都是个让很多程序员都觉得很郁闷的一个东西,我觉得创造正则表达式的那个家伙简直就是个奇葩,要不就是外星人。就那么一个字符规则校验就足以使那么多程序员为之抓狂,你可以想象这个东西该有多变态。由于本人水平有限,不可能写的那么全面,只是把比较实用的东西给写下来,还有对一些常用的正则表达式进行收集整理,如果有写的不对的地方,还希望各路大牛多多指教!代码真的很详细,句句有解释 正则表达式简介: 正则表达式是由一些具有特殊含义的字符组成的字符串,多用于查找、替换符合规则的字符串。在表单验证、Url映射
天蝎座的程序媛
2022/11/18
5200
基本正则表达式的运用【前端】
正则表达式验证汇总
一、收集1  (转自https://blog.csdn.net/jumtre/article/details/13775351)
xing.org1^
2018/10/10
1.2K0
winform中利用正则表达式得到有效的电话/手机号
private void btnTest_Click(object sender, EventArgs e)         {             //using System.Text.RegularExpressions; 先using这一段             string _Result = "";                            Match m = Regex.Match(txtMobile.Text, _Pattern);           
菩提树下的杨过
2018/01/22
5510
(90) 正则表达式 (下) / 计算机程序的思维逻辑
88节介绍了正则表达式的语法,上节介绍了正则表达式相关的Java API,本节来讨论和分析一些常用的正则表达式,具体包括: 邮编 电话号码,包括手机号码和固定电话号码 日期和时间 身份证 IP地址 URL Email地址 中文字符 对于同一个目的,正则表达式往往有多种写法,大多没有唯一正确的写法,本节的写法主要是示例。此外,写一个正则表达式,匹配希望匹配的内容往往比较容易,但让它不匹配不希望匹配的内容,则往往比较困难,也就是说,保证精确性经常是很难的,不过,很多时候,我们也没有必要写完全精确的表达式,需
swiftma
2018/02/01
9830
Android 常用正则表达式
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/77800756
程序员徐公
2018/09/17
2.1K0
正则表达式 - 电话号码
        写一个正则表达式匹配电话号码,并且括号、连字符或点号都是可选的。假定合规数据只包含以下15种匹配模式之一:
用户1148526
2023/04/28
6220
正则表达式 - 电话号码
最全的常用正则表达式
一、校验数字的表达式  1 数字:^[0-9]*$  2 n位的数字:^\d{n}$  3 至少n位的数字:^\d{n,}$  4 m-n位的数字:^\d{m,n}$  5 零和非零开头的数字:^(0
用户8671053
2021/11/02
22.7K0
ruby 常用正则表达式
validates_format_of :ip, :with => /^((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/
全栈程序员站长
2022/07/05
4350
常用正则表达式
var regexEnum = { intege:"^-?[1-9]\\d*$", //整数 intege1:"^[1-9]\\d*$", //正整数 int
大师级码师
2021/10/29
3340
相关推荐
正则表达式:验证手机和电话号码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文