Regular Expression – (正则表达式)匹配固定电话号码

之前介绍过如何用正则表达式匹配 IP 地址,今天要介绍的是用正则表达式匹配中国的固定电话号码。当然,首先我们要知道的就是中国过的电话号码的规则:

  • 第1位是 0,表示长途;
  • 接着2~3位数字表示区号,(这2~3位数字)第一位在1~9之间;
  • 后面是7~8位的(数字)电话号码;
  • (固定)电话号码第一位不能为 1(其实也不能为0,1开始的是手机号码),也就是第一位数在2~9之间;

固定电话号码的常用的写法大概有以下几种:

027 84611402
027 8461 1402
(027)84611402
(027)8461 1402
(027) 84611402
027-8461 1402
027-84611402
027-8461-1402

除了上面说的规则,为了便于阅读和识别,我们也会添加括号(和),空格或者连接符来格式化一下电话号码。

第1步:匹配区号

区号的开始可以有一个可选的括号。

匹配可选的(正)括号

一个可选的括号,换成正则表达式的规则就是:0个或者1个(。那么我们的正则表达式就是:\(?

还是来解释一下\(?的意义:

  • \( – 表示转义(开始)括号“(”,因为在正则表达式中“()”代表子表达式)。而我们这里要匹配的仅仅是括号这个字符,所以使用\(
  • ? – 用来做重复匹配,表示0~1次的重复。说明的是前面的\(出现0~1次;

匹配3~4位的数字区号

第一位数字是0,那没有什么好解释的,就是用数字0表示。接着是2~3的数字,而且第一位数字的区间是1-9。在介绍 IP 地址的时候介绍过,正则表达式中使用中括号“[]”表示字符区间,那么1-9的字符集区间就是:[1-9]

上面我们已经完成了前两位数字的匹配,后面1~2位的数字就没有限制规则了。我们就可以使用\d表示任意的一个数字,而这个数字的长度应该是1~2位,那么就是说这个数字会重复1~2次,那么完整的写法就是:\d{1,2}

所以匹配3~4位的数字区号的完整正则表达式就是:0[1-9]\d{1,2}

匹配可选的(反)括号

匹配可选的(反)括号规则和前面的匹配(正)括号完全一致,只是换成了反括号:\),所以可选的反括号应该这么写:\)?

最后我们把上面的3小段代码合并到一起,就得到了完整的匹配区号的表达式:\(?0[1-9]\d{1,2}\)?

第2步:匹配可选的空格或者连接符

为了格式化电话号码,我们会在区号和电话号码之间添加一个空格或者连接符。而这个规则使用正则表达式来说明就是字符集空格(\s)和连接符-两个字符中的一个重复0-1次。

“[]”表示字符区间,而这个区间里也就只有空格和连接符,那么得到的正则表达式就是:[\s\-]?

第3步:匹配7~8位的电话号码

固定电话号码,最后要做的就是匹配电话号码了。

匹配前4位电话号码

电话号码的第一位数在2~9之间,我们就应该使用字符集区间来表示这个数:[2-9],后面接着的是3位任意的数字:\d{3}。那么,完整的前4位号码的表达式就是:[2-9]\d{3}

匹配可选的空格或者连接符

为了电话号码便于阅读,我们会在前4位号码后添加一个可选的空格或者连接符。这个规则跟前面的一样,它的表达式是:[\s\-]?

匹配后3~4位电话号码

现在就剩下最后的3~4位的电话号码了,也就是3~4个任意的数字:\d{3,4}

所以完整的7~8位的电话号码的表达式就是:[2-9]\d{3}[\s\-]?\d{3,4}

最后的正则表达式结果

现在我们把所有这些表达式合并到一起,得到了完整的匹配固定电话号码的表达式:\(?0[1-9]\d{1,2}\)?[\s\-]?[2-9]\d{3}[\s\-]?\d{3,4}

JavaScript 中的实际应用

function isPhoneNumber(phone){
    var reg = /^\(?0[1-9]\d{1,2}\)?[\s\-]?[2-9]\d{3}[\s\-]?\d{3,4}$/;
	
    return reg.test(phone);
}

SHARE THIS PAGE

免责声明:本站文章中的观点都是作者个人观点,并没有以任何方式反映他所属机构的意见。

发表评论