ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5840|回复: 11

[求助] 匹配手机号的正则表达式的问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-9-1 17:08 | 显示全部楼层 |阅读模式
在一段文字里匹配手机号码,写了一个手机号码的正则:
  1. (?=[0-9])\b(13|14|15|17|18|19)[0-9]\s\d{4}\s\d{4}(?![0-9])
复制代码
有个问题想请教一下:
比如这段文字里有:手机号152 2542 5668 138 2542 2589 189 5804 6858等。
或者有:手机号152 2542 5668、电话号码010-88204512
都能匹配到想要的手机号,没问题;

如果有:手机号1152 2542 5668
或者有:手机号152 2542 56688、电话号码010-88204512
对于上面错误的手机号是不匹配的,也没问题。

但是,出现个问题:
比如:手机号Mobile Phone152 2542 5668
就会有问题,上面的手机号并没错,但是匹配不到,不知道上面的表达式如何改动?


TA的精华主题

TA的得分主题

发表于 2018-9-1 18:17 | 显示全部楼层
  1. Public Function getMobilCode(ByVal s As String) As String
  2.     Dim js As Object, j As String
  3.     Set js = CreateObject("MSScriptControl.ScriptControl")
  4.     js.Language = "JavaScript"
  5.     j = "a=[],r=/(?:\D|^)(1[35789]\d\s\d{4}\s\d{4})(?!\d)/g;while(m=r.exec('" & s & "')){a.push(m[1]);};a.join('\n');"
  6.     getMobilCode = js.eval(j)
  7. End Function
  8. Sub main()
  9.     Dim s As String
  10.     s = "比如这段文字里有:手机号152 2542 5668 138 2542 2589 189 5804 6858等。"
  11.     s = s & "或者有:手机号152 2542 5668、电话号码010-88204512"
  12.     s = s & "都能匹配到想要的手机号,没问题;"
  13.     s = s & "如果有:手机号1152 2542 5668"
  14.     s = s & "或者有:手机号152 2542 56688、电话号码010-88204512"
  15.     s = s & "对于上面错误的手机号是不匹配的,也没问题。"
  16.     s = s & "但是,出现个问题:"
  17.     s = s & "比如:手机号Mobile Phone152 2542 5668"
  18.     s = s & "就会有问题,上面的手机号并没错,但是匹配不到,不知道上面的表达式如何改动?"
  19.     MsgBox getMobilCode(s)
  20. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-9-1 19:22 | 显示全部楼层

测试通过,看来JavaScript的正则可以,谢谢!

  1. (?:\D|^)(1[35789]\d\s\d{4}\s\d{4})(?!\d)
复制代码


但是在线测试没通过:
https://www.jb51.net/tools/zhengze.htm

TA的精华主题

TA的得分主题

发表于 2018-10-7 19:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看到你在我的帖子里的留言给的这个链接,然后过来看一下,试着解答一下:

一、手机号码,按你提供的数据格式,可以表示为:
(1[3-57-9]\d\s?\d{4}\s?\d{4})
二、手机号码的前后,都不允许紧接出现数字,所以以上表达式的前后都需要加上限定条件。
正确的限定方式为:
\D(1[3-57-9]\d\s?\d{4}\s?\d{4})(?!\d)
注意:不能使用\b做限定条件。
三、零宽先行断言,可以用(?!\d)或(?=\D|$),而不能使用(?=\D)。因为(?=\D)不能匹配字符结尾位置。

使用我的【超级查找替换】加载宏小工具,并套用“万能正则表达式”,演示如下:

超级替换126.gif

TA的精华主题

TA的得分主题

发表于 2018-10-7 20:30 | 显示全部楼层
pyshon语言写的代码》》》》》》
  1. import re

  2. mystr='''
  3.         有个问题想请教一下:
  4.         比如这段文字里有:手机号152 2542 5668 138 2542 2589 189 5804 6858等。
  5.         或者有:手机号152 2542 5668、电话号码010-88204512
  6.         都能匹配到想要的手机号,没问题;
  7.         
  8.         如果有:手机号1152 2542 5668
  9.         或者有:手机号152 2542 56688、电话号码010-88204512
  10.         对于上面错误的手机号是不匹配的,也没问题。
  11.         
  12.         但是,出现个问题:
  13.         比如:手机号Mobile Phone152 2542 5668
  14.         就会有问题,上面的手机号并没错,但是匹配不到,不知道上面的表达式如何改动?'''

  15. reg=re.compile(r'(?<!\d)1[35789]\d\s*\d{4}\s*\d{4}(?!\d)')
  16. print(reg.findall(mystr))
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-8 16:41 | 显示全部楼层
ggmmlol 发表于 2018-10-7 19:34
看到你在我的帖子里的留言给的这个链接,然后过来看一下,试着解答一下:

一、手机号码,按你提供的数据 ...

零宽先行断言(?!\d),用来断言匹配字符的前面的字符,好像在VB的正则里是不支持的,你可以测试一下。

TA的精华主题

TA的得分主题

发表于 2018-10-8 17:04 | 显示全部楼层
ggmmlol 发表于 2018-10-7 19:34
看到你在我的帖子里的留言给的这个链接,然后过来看一下,试着解答一下:

一、手机号码,按你提供的数据 ...

你编写的表达式,代入后结果正确

=tq(A2,-1.1,"\D(1[3-57-9]\d\s?\d{4}\s?\d{4})(?!\d)")
提取手机.zip (11.01 KB, 下载次数: 135)

TA的精华主题

TA的得分主题

发表于 2018-10-8 17:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
向東 发表于 2018-10-8 16:41
零宽先行断言(?!\d),用来断言匹配字符的前面的字符,好像在VB的正则里是不支持的,你可以测试一下。

支持零宽度先行断言,但不支持零宽度后发断言

TA的精华主题

TA的得分主题

发表于 2018-10-8 19:09 | 显示全部楼层
本帖最后由 ggmmlol 于 2018-10-8 19:14 编辑
向東 发表于 2018-10-8 16:41
零宽先行断言(?!\d),用来断言匹配字符的前面的字符,好像在VB的正则里是不支持的,你可以测试一下。

零宽行断言,并不是断言匹配字符的前面位置的字符,反而是断言匹配字符的后面位置的字符。
其正确理解,就是对后面将要出现的字符,先行判断的意思。

所以,,不要看到一个“”字,就简单以为是对“”面位置做判断。不要望文生义啊。

TA的精华主题

TA的得分主题

发表于 2018-10-8 19:30 | 显示全部楼层
zopey 发表于 2018-10-8 17:04
你编写的表达式,代入后结果正确

=tq(A2,-1.1,"\D(1[3-57-9]\d\s?\d{4}\s?\d{4})(?!\d)")

你的公式,用到的是香川群子编写的自定义函数,其中主要是用正则表达式的Execute方法加上循环提取目标字符串,用上我写的这个关键的正则表达式,结果应当是正确的。所以附件我就不下载了。

我的超级查找替换加载宏,用的是正则对象的Replace方法,可以不用循环而完成提取。在我的加载宏里面,也有以Replace方法编写的自定义函数,其代码比TQ函数更加简单高效。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-24 00:19 , Processed in 0.040104 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表