正则表达式 - 电话号码

这篇具有很好参考价值的文章主要介绍了正则表达式 - 电话号码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。

一、需求

        写一个正则表达式匹配电话号码,并且括号、连字符或点号都是可选的。假定合规数据只包含以下15种匹配模式之一:

  1. xxxxxxx             8277019
  2. xxx.xxxx            827.7019
  3. xxx-xxxx            827-7019
  4. xxxxxxxxxx        7078277019
  5. xxxxxx.xxxx       707827.7019
  6. xxxxxx-xxxx       707827-7019
  7. xxx.xxxxxxx       707.8277019
  8. xxx.xxx.xxxx      707.827.7019
  9. xxx.xxx-xxxx      707.827-7019
  10. xxx-xxxxxxx       707-8277019
  11. xxx-xxx.xxxx      707-827.7019
  12. xxx-xxx-xxxx      707-827-7019
  13. (xxx)xxxxxxx      (707)8277019
  14. (xxx)xxx.xxxx     (707)827.7019
  15. (xxx)xxx-xxxx     (707)827-7019

二、实现

1. 创建表并生成测试数据

create table t_regexp (a text);

insert into t_regexp values
-- 合规数据
('8277019'),
('827.7019'),
('827-7019'),
('7078277019'),
('707827.7019'),
('707827-7019'),
('707.8277019'),
('707.827.7019'),
('707.827-7019'),
('707-8277019'),
('707-827.7019'),
('707-827-7019'),
('(707)8277019'),
('(707)827.7019'),
('(707)827-7019'),
-- 噪声数据
('a277019'),
('abc827-7019'),
('8a2b7c-7019'),
('.827-7019'),
('70711-827-7019'),
('(707)-827-7019'),
('(707).827-7019'),
('707-827-701912'),
('(707.827-7019'),
('(707827-7019');

2. 编写正则表达式

^(\(\d{3}\)|\d{3}[.-]?)?\d{3}[.-]?\d{4}$

3. 使用regexp函数查询验证

-- 注意SQL中要使用 \ 对正则表达式中的转义字符 \ 进行转义,看起来就如下为两个连续的 \:\\
select * from t_regexp 
 where a regexp '^(\\(\\d{3}\\)|\\d{3}[.-]?)?\\d{3}[.-]?\\d{4}$';

三、分析与知识点

1. 匹配字符串字面值

707-827-7019

        上面这个正则表达式用字符串字面值(string literal)来匹配目标字符串。所谓字符串字面值,就是字面上看起来是什么就是什么。

2. 使用字符组匹配数字

[0-9]

        正则表达式 [0-9] 的含义是“匹配0到9范围内的任意数字”。正则表达式将方括号视为特殊的元字符(metacharacter),因此方括号不参与匹配。元字符是在正则表达式中有特殊含义的字符,也是保留字符。[0-9] 这种形式的正则表达式称做字符组(character class)。可以对数字的范围进行进一步限定,比如:

[012789]

        这个字符组只会匹配列出的数字,即 0、1、2、7、8、9 。要匹配任意10位以连字符分隔的电话号码,可以使用以下正则表达式:

[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]

        这是可以的,但太长了,更好的方法是采用简写形式。

3. 使用字符组简写式匹配一位数字

        \d 可以像 [0-9] 一样匹配任意阿拉伯数字。这种正则表达式叫做字符组简写式(character shorthand)。可以使用以下表达式来匹配电话号码中的任意数字:

\d\d\d-\d\d\d-\d\d\d\d

        重复 \d 三次和四次就可以分别匹配三个和四个数字。该表达式中的连字符是一个字面值,因此会被原样匹配。除了和上面表达式一样,使用连字符本身(-)来匹配连字符之外,也可以用转义的大写D(\D),它匹配任何一个非数字字符。以下示例使用了 \D 来匹配连字符:

\d\d\d\D\d\d\d\D\d\d\d\d

4. 匹配任意字符

        还可以用点号(.)来匹配连字符:

\d\d\d.\d\d\d.\d\d\d\d

        点号(英文句号)是一个通配符,可以匹配任意字符(但某些情况下不能匹配行起始符)。以上示例中的正则表达式匹配了连字符,但它也可以匹配百分号(%):

707%827%7019

        或者是竖线(|):
 

707|827|7019

        亦或其他字符。

5. 使用捕获分组和后向引用

        可以使用捕获分组(capturing group)来匹配电话号码中的某一部分,然后使用后向引用(backreference)对分组中的内容进行引用。要创建捕获分组,先将一个 \d 放在一对圆括号中,这样就将它放入了一个分组中,后面可以用 \1 来对捕获的内容进行后向引用:

(\d)\d\1

        \1 对括号内分组捕获的内容进行了反向引用。(\d) 匹配第一个数字并将其捕获;\d 匹配第二个数字但没有捕获,因为没有括号;\1 对捕获的数字进行反向引用。这个正则表达式只匹配了区号。现在可以用一个分组和几个后向引用对整个电话号码进行匹配:

(\d)0\1\D\d\d\1\D\1\d\d\d

6. 使用量词

        现在用另一种语法来匹配电话号码:

\d{3}-?\d{3}-?\d{4}

        花括号中的数字表示待查找的数字出现的次数。包含数字的花括号是一种量词(quantifier)。花括号本身用做元字符。问号是另一种量词,在以上表达式中表示连字符是可选的。也就是说,连字符可以不出现或只出现一次。还有其他的量词,例如加号(+)表示“一个或多个”,星号(*)表示“零个或多个”。使用量词能让正则表达式变得更简洁:

(\d{3,4}[.-]?)+

        加号表示出现一次或多次。这个正则表达式表示括号里的模式出现一次或多次,括号里的模式匹配三位或四位数字,后跟一个连字符或一个点号。下面逐一解释表达式中的每一项:左圆括号 ( 为捕获分组的起始符;反斜杠 \ 为字符组简写式的起始符(对之后的字符进行转义);字符 d 为字符组简写式的结束符(d匹配0到9范围内的任意数字);左花括号 { 为量词起始符;数字3为匹配的最小数量;逗号 , 隔开不同的数量;数字4为匹配的最大数量;右花括号 } 为量词的结束符;左方括号 [ 为字符组的起始符;点号 . (匹配点号本身);连字符 - 匹配连字符的本身;右方括号 ] 为字符组的结束符;问号 ?表示量词“零个或一个”;右圆括号 ) 为捕获分组的结束符;加号 + 表示量词“一个或多个”。这个表达式只能匹配3位或4位的数字,而不管是否符合电话号码的格式。我们来改进一下:

(\d{3}[.-]?){2}\d{4}

        这个表达式匹配的字符串是连续两个无括号的三位数字,每三位数字后可以带连字符也可以不带,最后是一个四位数字。这个正则表达式有问题,从 https://www.dute.org/regex 在线测试结果一目了然。

        对于测试数据,合规数据仅匹配了具有区号且区号不带括号的数据:

正则表达式 - 电话号码

        而噪声数据也匹配了4个:

正则表达式 - 电话号码

        问题出在对字符串首尾和区号的匹配上,下面加以改进。

7. 括选文字符

        这个正则表达式表示第一个3位数字可以带也可以不带括号,即区号是可选的:

^(\(\d{3}\)|\d{3}[.-]?)?\d{3}[.-]?\d{4}$

        为了便于理解,我们再按匹配次序看一下表达式中的各项。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符

说明

\

转义符

(), (?:), (?=), []

小括号和中括号

*, +, ?, {n}, {n,}, {n,m}

限定符

^, $, \任何元字符、任何字符

定位点和序列(即:位置和顺序)

|

“或”操作。字符具有高于或运算符的优先级,使得“m|food”匹配“m”或“food”。若要匹配“mood”或“food”,需使用括号创建子表达式,从而产生“(m|f)ood”。

\(\d{3}\)|\d{3}[.-]?

        \( 表示左括号本身;\d 匹配一位数字;\d 之后的{3}是量词,表示匹配三位数字;\) 匹配右括号本身;竖线符 | 表示选择,也就是从多个可选项中选择一个;\d 匹配一位数字;{3} 是表示匹配三位数字的量词;[.-]?匹配一个可选的点号或连字符。这部分表达式表示“匹配一个带括号的区号,或一个不带括号但可能包含连字符的区号”:

(xxx)
xxx
xxx.
xxx-

^(\(\d{3}\)|\d{3}[.-]?)?

        出现在正则表达式起始位置的脱字符 ^ ,表示0个或1个区号会出现在一行的起始位置,如下的噪声数据将被过滤掉:
70711-827-7019
(707.827-7019
(707827-7019

\d{3}[.-]?

        \d 匹配一位数字;{3} 表示匹配三位数字的量词;[.-]? 匹配另一个可选的点号或连字符;

\d{4}$

        \d 匹配一位数字;{4} 是表示匹配四位数字的量词;美元符 $ 匹配行结束位置,即以4位数字结尾,如下的噪声数据将被过滤掉:
707-827-701912

        注意 ^ 的位置,一定要在分组外。如果要放到分组内:

(^\(\d{3}\)|^\d{3}[.-]?)?\d{3}[.-]?\d{4}$

        则只要符合 \d{3}[.-]?\d{4}$ 的数据都会被匹配到:

正则表达式 - 电话号码文章来源地址https://www.toymoban.com/news/detail-422442.html

到了这里,关于正则表达式 - 电话号码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Javascript正则表达式常用的验证(验证手机号,电话,邮箱,网址等)

    验证手机号码是否合法 验证规则:11位数字,以1开头。 第二位不能是二,不能是0[3456789] 例一: 预览效果  例二: 前面添加 ! 的意义是给这个函数  取反 预览效果 验证电话号码  验证规则:区号+号码,区号以0开头,3位或4位 号码由7位或8位数字组成 区号与号码之间可以

    2023年04月22日
    浏览(34)
  • 正则匹配字符串中电话号码的中间几位为指定字符

            今天遇到一个需求,要替换字符串中的电话号码的中间几位为星号, 泥马之前是后端做得,现在要我前端弄 , 心里一万个 艹 * 马............. 此处省略9997个字 .         直接上代码------- , 这里的字符做了连续判断,如果两个电话号码是连续的,就不做处理,         希

    2024年02月07日
    浏览(33)
  • 如何申请400电话号码

    导语:在现代商业环境中,拥有一个400电话号码对于企业来说至关重要。本文将介绍如何申请400电话号码,以及相关的步骤和注意事项。 正文: 一、了解400电话号码的概念和优势 400电话号码是一种虚拟电话号码,以400开头,用于企业客户服务和销售热线。与传统的地区号码

    2024年02月07日
    浏览(26)
  • Bash 有效电话号码

    给定一个包含电话号码列表(一行一个电话号码)的文本文件 file.txt,写一个单行 bash 脚本输出所有有效的电话号码。 你可以假设一个有效的电话号码必须满足以下两种格式: (xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字) 你也可以假设每行前后没有多余的空格字符。 示例:

    2024年02月16日
    浏览(31)
  • 电话号码的组合

    电话号码的组合 力扣 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits = \\\"23\\\" 输出:[\\\"ad\\\",\\\"ae\\\",\\\"af\\\",\\\"bd\\\",\\\"be\\\",\\\"bf\\\",\\\"cd\\\",\\\"ce\\\",\\\"cf\\\"] 示例 2: 输

    2024年02月13日
    浏览(26)
  • 【正则表达式】正则表达式常见匹配模式

    模式 描述 w 匹配字母数字及下划线 W 匹配非字母数字下划线 s 匹配任意空白字符,等价于 [tnrf]. S 匹配任意非空字符 d 匹配任意数字,等价于 [0-9] D 匹配任意非数字 A 匹配字符串开始 Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 z 匹配字符串结

    2024年02月09日
    浏览(62)
  • 电话号码的字母组合-算法

    按电话上数字与字母的对应关系,如2={a,b,c},3={d,e,f}等,给定一串数字如267,则求出abc,mno,qprs的所有组合,如amq,amp...cor,cos等 遍历都可以用回溯的方式尝试解决,每次遍历结束后,将上一层元素删除,满足长度,则加入到结果中      

    2024年01月22日
    浏览(27)
  • 17. 电话号码的字母组合

    给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 示例 2: 示例 3: 提示: 0 = digits.length = 4 digits[i] 是范围 [\\\'2\\\', \\\'9\\\'] 的一个数字。 解答

    2024年02月15日
    浏览(30)
  • android 实现拨打电话号码。

    在拨打电话号码之前,预设一个B号码,正常使用电话时,本来输入的是A号码。实际拨打的是B号码。但是接听页面显示的是A号码。是不是比较绕,在android9之前,各厂商的实现不了,android7以下可以实现。但是现在很多机型最低都是11以上了。 兴趣使然,研究了几天,终于出

    2024年02月14日
    浏览(31)
  • 判断电话号码是否重复-excel

    有时候重复的数据不需要或者很烦人,就需要采取措施,希望以下的方法能帮到你。 方法一: 1)针对第一个单元格输入等号,以及公式countif(查找记录数的范围,需要查找的单元格) 2)输入enter之后,然后鼠标变为黑色的加号后,往下拉自动填充,如下图所示。 方法二:先

    2024年02月03日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包