Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3762|回复: 11

[已解决]关于正则的疑问

[复制链接]
发表于 2017-8-24 09:19 | 显示全部楼层 |阅读模式
2.png 运行以下代码,只得到B列的手机,为什么不能将A列的手机全部提取,C列也应该有手机号码啊
下面的代码出了什么问题?
Sub 提取手机号码1()
        arr = Range("a2:a" & Range("a65536").End(3).Row)
        Set reg = CreateObject("vbscript.regexp")
        reg.Pattern = "(\D|^)(1[34578]\d{9})(\D|$)"
        reg.Global = True
        For i = 1 To UBound(arr, 1)
                s = arr(i, 1)
                If reg.test(s) Then
                        Set mymatch = reg.Execute(s)
                        m = 2
                        For Each mat In mymatch
                                Cells(i + 1, m) = mat.SubMatches(1)
                                m = m + 1
                        Next
                End If
        Next i
End Sub




最佳答案
2017-8-24 10:22
reg.Pattern = "(\D|^)(1[34578]\d{9})(\D|$)"
1511879893915217549176
\D 已经被消耗了 , 第二次\D匹配不到了
====================================
这个数据可以 15118798939、、15217549176

1511879893915217549176 想强壮的提取的话 , 貌似可行的方法:
1) 提一个 以后 .replce( ,"")  一下 ,然后再提取.

2) 非数字重复一下 , 再提取 1511879893915217549176


72信息.zip

9.45 KB, 下载次数: 11

发表于 2017-8-24 09:35 | 显示全部楼层
回复

使用道具 举报

发表于 2017-8-24 09:45 | 显示全部楼层
  1. Sub 提取手机号码()
  2.     arr = Range("a2:a" & Range("a65536").End(3).Row)
  3.     Set reg = CreateObject("vbscript.regexp")
  4.     reg.Pattern = "1\d{10}"
  5.     reg.Global = True
  6.     For i = 1 To UBound(arr, 1)
  7.         s = arr(i, 1)
  8.         If reg.test(s) Then
  9.             Set mymatch = reg.Execute(s)
  10.             m = 2
  11.             For Each mat In mymatch
  12.                 Cells(i + 1, m) = mat
  13.                 m = m + 1
  14.             Next
  15.         End If
  16.     Next i
  17. End Sub
复制代码
回复

使用道具 举报

发表于 2017-8-24 10:22 | 显示全部楼层    本楼为最佳答案   
reg.Pattern = "(\D|^)(1[34578]\d{9})(\D|$)"
1511879893915217549176
\D 已经被消耗了 , 第二次\D匹配不到了
====================================
这个数据可以 15118798939、、15217549176

1511879893915217549176 想强壮的提取的话 , 貌似可行的方法:
1) 提一个 以后 .replce( ,"")  一下 ,然后再提取.

2) 非数字重复一下 , 再提取 1511879893915217549176


回复

使用道具 举报

发表于 2017-8-24 10:29 | 显示全部楼层
3楼 1/d{10} 中国的电话号码不会冲突 ,
号码8位 , 区号从后向前 第3位 不存在 1 (01,021,0311)
回复

使用道具 举报

发表于 2017-8-24 10:30 | 显示全部楼层
本帖最后由 苏子龙 于 2017-8-24 10:31 编辑

Sub 提取手机号码1()
        arr = Range("a2:a" & Range("a65536").End(3).Row)
        Set reg = CreateObject("vbscript.regexp")
        reg.Pattern = "\d{11}"
        reg.Global = True
        For i = 1 To UBound(arr, 1)
                s = arr(i, 1)
                If reg.test(s) Then
                        Set mymatch = reg.Execute(s)
                        m = 2
                        For Each mat In mymatch
                                Cells(i + 1, m) = mat
                                m = m + 1
                        Next
                End If
        Next i
End Sub

评分

参与人数 1 +1 收起 理由
lingyuncelia + 1

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-8-24 17:05 | 显示全部楼层

其实我只是想问我这个代码到底哪里不妥了,为什么无法提取同一单元格的2个手机号码?
回复

使用道具 举报

 楼主| 发表于 2017-8-24 17:07 | 显示全部楼层
苏子龙 发表于 2017-8-24 10:30
Sub 提取手机号码1()
        arr = Range("a2:a" & Range("a65536").End(3).Row)
        Set reg = Cre ...

其实我只是想问我这个代码到底哪里不妥了,为什么无法提取同一单元格的2个手机号码?
回复

使用道具 举报

 楼主| 发表于 2017-8-26 09:29 | 显示全部楼层

reg.Pattern = "1\d{10}",太简单了吧,老兄。永远不要相信客户的数据。有时他们这样写11928509692,根本无这样的手机。有时写1369024992318928509693,两个手机一起写,写数据的很绝的。有时写136902499234,都11位了。 reg.Pattern = "1[34578]\d{9}(?=\D|1[34578]\d{9}|$)",其它我抄你就得了。
回复

使用道具 举报

 楼主| 发表于 2017-8-26 09:30 | 显示全部楼层
苏子龙 发表于 2017-8-24 10:30
Sub 提取手机号码1()
        arr = Range("a2:a" & Range("a65536").End(3).Row)
        Set reg = Cre ...

reg.Pattern = "1[34578]\d{9}(?=\D|1[34578]\d{9}|$)"
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 21:32 , Processed in 2.487735 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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