Excel精英培训网

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

[已解决]当reg.Pattern = "1\d{10}"遇上混乱的登记时

[复制链接]
发表于 2016-5-2 16:09 | 显示全部楼层 |阅读模式
本帖最后由 lingyuncelia1 于 2016-5-2 16:46 编辑

小灵通:8302143918928509692,肉眼看得出手机号码是:18928509692,
但用reg.Pattern = "1\d{10}",会变成:
14391892850

如果用reg.Pattern = "189\d{8}",那如果电话是移动、联通呢,那代码岂不是好长?
有时登记电话的人就是懒到出汁,连个空格都无,连个“、\-()[]”都无。
女189299399660,男13929950449
肉眼看得出女人的手机多了一位数,无效。
最佳答案
2016-5-2 16:34
应该可以应付大多数情况了。
  1. Sub tt()
  2.     arr = Range("a1:a" & [a65536].End(3).Row)
  3.     For i = 2 To UBound(arr)
  4.         x = arr(i, 1)
  5.         j = 4
  6.         For k = 1 To Len(x)    '把所有非数字用","代替
  7.             If Not IsNumeric(Mid(x, k, 1)) Then Mid(x, k, 1) = ","
  8.         Next
  9.         xrr = Split(x, ",")      '以","分离字符串
  10.         For Each x In xrr
  11.             Do While Len(x) >= 11      '当字符串长度>=11(表示有可能出现手机号)
  12.                 xh = Right(x, 11)     '从后往前找
  13.                 If Left(xh, 1) = "1" Then  '找到一个手机号
  14.                     j = j + 1
  15.                     Cells(i, j) = xh
  16.                     x = Left(x, Len(x) - 11) '长度减11
  17.                 Else
  18.                     x = Left(x, Len(x) - 1)   '没找到,长度减1继续找
  19.                 End If
  20.                
  21.                 xq = Left(x, 11)     '从前往后找
  22.                 If Left(xq, 1) = "1" Then  '找到一个手机号
  23.                     j = j + 1
  24.                     Cells(i, j) = xq
  25.                     x = Mid(x, 12) '长度减11
  26.                 Else
  27.                     x = Mid(x, 2)  '没找到,长度减1继续找
  28.                 End If
  29.             Loop
  30.         Next
  31.     Next
  32. End Sub
复制代码
发表于 2016-5-2 16:34 | 显示全部楼层    本楼为最佳答案   
应该可以应付大多数情况了。
  1. Sub tt()
  2.     arr = Range("a1:a" & [a65536].End(3).Row)
  3.     For i = 2 To UBound(arr)
  4.         x = arr(i, 1)
  5.         j = 4
  6.         For k = 1 To Len(x)    '把所有非数字用","代替
  7.             If Not IsNumeric(Mid(x, k, 1)) Then Mid(x, k, 1) = ","
  8.         Next
  9.         xrr = Split(x, ",")      '以","分离字符串
  10.         For Each x In xrr
  11.             Do While Len(x) >= 11      '当字符串长度>=11(表示有可能出现手机号)
  12.                 xh = Right(x, 11)     '从后往前找
  13.                 If Left(xh, 1) = "1" Then  '找到一个手机号
  14.                     j = j + 1
  15.                     Cells(i, j) = xh
  16.                     x = Left(x, Len(x) - 11) '长度减11
  17.                 Else
  18.                     x = Left(x, Len(x) - 1)   '没找到,长度减1继续找
  19.                 End If
  20.                
  21.                 xq = Left(x, 11)     '从前往后找
  22.                 If Left(xq, 1) = "1" Then  '找到一个手机号
  23.                     j = j + 1
  24.                     Cells(i, j) = xq
  25.                     x = Mid(x, 12) '长度减11
  26.                 Else
  27.                     x = Mid(x, 2)  '没找到,长度减1继续找
  28.                 End If
  29.             Loop
  30.         Next
  31.     Next
  32. End Sub
复制代码

评分

参与人数 2 +9 收起 理由
today0427 + 6 棒,学习了
lingyuncelia1 + 3 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-5-2 16:45 | 显示全部楼层
grf1973 发表于 2016-5-2 16:34
应该可以应付大多数情况了。

看上去,我估计也是,应该其他人不会再捣鼓些什么了吧。
回复

使用道具 举报

发表于 2016-5-3 10:23 | 显示全部楼层
.pattern="1[358]\d{9}",能解决绝大部分。
回复

使用道具 举报

发表于 2016-5-3 10:28 | 显示全部楼层
.pattern="1[358]\d{9}(?!\d)"这样可能会把一部分数字超过11位,但可能提取前11位就正确的号码排除在了。

评分

参与人数 2 +6 收起 理由
today0427 + 3 来学习
lingyuncelia1 + 3 很给力

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2016-5-3 14:36 | 显示全部楼层
datongye 发表于 2016-5-3 10:28
.pattern="1[358]\d{9}(?!\d)"这样可能会把一部分数字超过11位,但可能提取前11位就正确的号码排除在了。

.pattern="1[358]\d{9}"
这个我是明白的,1在前,358选其中一个,后续9个数字。
.pattern="1[358]\d{9}(?!\d)"
但对于这个,后面多了(?!\d)就不明白是什么回事了?
大侠能否解释下什么意思?


回复

使用道具 举报

发表于 2016-5-3 17:14 | 显示全部楼层
(?!\d)后面不跟数字即正确
回复

使用道具 举报

 楼主| 发表于 2016-5-3 17:31 | 显示全部楼层
datongye 发表于 2016-5-3 10:28
.pattern="1[358]\d{9}(?!\d)"这样可能会把一部分数字超过11位,但可能提取前11位就正确的号码排除在了。

实验证明,的确可以对付很多情况了,也如你所说,如果是2个手机号码完全贴在一起,的确是给排除了。
回复

使用道具 举报

发表于 2016-5-3 17:42 | 显示全部楼层
鱼与熊掌不可兼得。最主要是看你数据格式怎样,分类摆放,各自采用不同的方法。这样就可以解决问题了。
回复

使用道具 举报

发表于 2016-5-3 17:51 | 显示全部楼层
lingyuncelia1 发表于 2016-5-3 17:31
实验证明,的确可以对付很多情况了,也如你所说,如果是2个手机号码完全贴在一起,的确是给排除了。

如果是2个手机号码完全贴在一起,只要最后一个正确,还是可以提取最后一个出来的。好歹还有一个用用。呵呵。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 10:18 , Processed in 0.410951 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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