Excel精英培训网

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

[已解决]正则表达式分组的运用 高手请指点下

[复制链接]
发表于 2015-1-9 12:35 | 显示全部楼层 |阅读模式
本帖最后由 baoqiangxiao 于 2015-1-9 21:11 编辑

(\S+) (\S+) (\S) (\d+)(( \S+){1,3})
1.(\d+)后面为什么不需要空格       (已解决)
2.(( \S+){1,3})在匹配内蒙古自治区的时候为什么不会下一个人的姓名匹配到内蒙古自治区后面   类似城市地区   (已解决)

3.为什么会出现“洪山区”在item6中?
最佳答案
2015-1-9 14:30
(\S+) (\S+) (\S) (\d+)(( \S+){1,3})
1.(\d+)后面为什么不需要空格
不是(\d+)后面不需要空格,而是把空格放在后面去了
注意看(( \S+){1,3})红色部分,有空格
2.(( \S+){1,3})在匹配内蒙古自治区的时候为什么不会下一个人的姓名匹配到内蒙古自治区后面   类似城市地区
请注意看红色加粗的位置,中间的空格个数
(( \S+){1,3}):( \S+)重复1到3次
然而:内蒙古自治区  顾君 红色部分有中间有两个空格而不是一个

以下是数据源
苗男萌 420111196405251685 女 48 湖北省 武汉市 洪山区 薛曼女 44081119680302798X 女 44 广东省 湛江市 麻章区 于鑫 542624197710246658 男 35 西藏自治区 林芝地区 墨脱县 融玲翡 150824198306256601 女 29 内蒙古自治区  顾君 530422198409094752 男 28 云南省 玉溪市 澄江县 钱嘉男 469035196202167193 男 50 海南省  麻修勇 511527197704238990 男 35 四川省 宜宾市 筠连县 边涵蕾 530622197512261287 女 37 云南省  卜微 350200196811269483 女 44 福建省 厦门市 厦门市 阚小乐 411600197411288734 男 38 河南省  融碧蓉 451028199009293463 女 22 广西壮族自治区  廉代卉 44010319680306028X 女 44 广东省 广州市 荔湾区 朱争 210726198703014378 男 25 辽宁省 锦州市 黑山县 徐贝 610601196401187807 女 48 陕西省 延安市 市辖区 殷冬 430781198411248493 男 28 湖南省 常德市 津市市 孙凌春 431124198402078462 女 28 湖南省 永州市 道县 丁红梅 130981198206188284 女 30 河北省 沧州市 泊头市 蔚然 632324196704122182 女 45 青海省 黄南藏族自治州 河南蒙古族自治县 宓香菱 371103196505169263 女 47 山东省 日照市

7-22.分组运用(提取身份证信息).zip

16.34 KB, 下载次数: 15

发表于 2015-1-9 14:30 | 显示全部楼层    本楼为最佳答案   
(\S+) (\S+) (\S) (\d+)(( \S+){1,3})
1.(\d+)后面为什么不需要空格
不是(\d+)后面不需要空格,而是把空格放在后面去了
注意看(( \S+){1,3})红色部分,有空格
2.(( \S+){1,3})在匹配内蒙古自治区的时候为什么不会下一个人的姓名匹配到内蒙古自治区后面   类似城市地区
请注意看红色加粗的位置,中间的空格个数
(( \S+){1,3}):( \S+)重复1到3次
然而:内蒙古自治区  顾君 红色部分有中间有两个空格而不是一个

以下是数据源
苗男萌 420111196405251685 女 48 湖北省 武汉市 洪山区 薛曼女 44081119680302798X 女 44 广东省 湛江市 麻章区 于鑫 542624197710246658 男 35 西藏自治区 林芝地区 墨脱县 融玲翡 150824198306256601 女 29 内蒙古自治区  顾君 530422198409094752 男 28 云南省 玉溪市 澄江县 钱嘉男 469035196202167193 男 50 海南省  麻修勇 511527197704238990 男 35 四川省 宜宾市 筠连县 边涵蕾 530622197512261287 女 37 云南省  卜微 350200196811269483 女 44 福建省 厦门市 厦门市 阚小乐 411600197411288734 男 38 河南省  融碧蓉 451028199009293463 女 22 广西壮族自治区  廉代卉 44010319680306028X 女 44 广东省 广州市 荔湾区 朱争 210726198703014378 男 25 辽宁省 锦州市 黑山县 徐贝 610601196401187807 女 48 陕西省 延安市 市辖区 殷冬 430781198411248493 男 28 湖南省 常德市 津市市 孙凌春 431124198402078462 女 28 湖南省 永州市 道县 丁红梅 130981198206188284 女 30 河北省 沧州市 泊头市 蔚然 632324196704122182 女 45 青海省 黄南藏族自治州 河南蒙古族自治县 宓香菱 371103196505169263 女 47 山东省 日照市
回复

使用道具 举报

发表于 2015-1-9 15:38 | 显示全部楼层
本帖最后由 香川群子 于 2015-1-9 15:47 编辑

把正则表达式中的空格符号用\s代替……显性处理一下:

(\S+) (\S+) (\S) (\d+)(( \S+){1,3})
(\S+)\s(\S+)\s(\S)\s(\d+)((\s\S+){1,3})


回复

使用道具 举报

发表于 2015-1-9 16:04 | 显示全部楼层
本帖最后由 香川群子 于 2015-1-9 16:10 编辑

楼主问题的正则表达式可以简化为:
"(\S+\s){5,7}"
即,提取连续的5-7组【任意字符+1个空格】,并会以连续2个以上空格做提取内容的区分。
  1. Sub test()
  2.     With CreateObject("vbscript.regexp")
  3.         .Global = True
  4.         '.Pattern = "(\S+)\s(\S+)\s(\S)\s(\d+)((\s\S+){1,3})"  '原先的复杂表达式
  5.         .Pattern = "(\S+\s){5,7}"

  6.         i = 1 '起始第1行为标题
  7.         For Each m In .Execute(Sheet3.[a1]) '正则处理A1单元格得到结果数组mat 然后遍历每个结果
  8.             s = Split(m, , 5) '用正则提取的每个结果,用Split拆分为5组(前4组+剩余1组含任意个空格)
  9.             i = i + 1
  10.             For j = 1 To 5
  11.                 Cells(i, j) = s(j - 1)
  12.             Next
  13.         Next
  14.     End With
  15. End Sub
复制代码
此题关键在于,对Split方法的灵活应用……估计很多人并不知道Split的第3个参数可以有这么个用法。呵呵。
回复

使用道具 举报

发表于 2015-1-9 16:16 | 显示全部楼层
输出部分也可以简化:
  1. Sub test()
  2.     With CreateObject("vbscript.regexp")
  3.         .Global = True
  4.         .Pattern = "(\S+\s){5,7}"
  5.         i = 1
  6.         For Each m In .Execute(Sheet3.[a1])
  7.             i = i + 1: Cells(i, 1).Resize(, 5) = Split(m, , 5)
  8.         Next
  9.     End With
  10. End Sub
复制代码
呵呵
回复

使用道具 举报

 楼主| 发表于 2015-1-9 20:21 | 显示全部楼层
香川群子 发表于 2015-1-9 16:04
楼主问题的正则表达式可以简化为:
"(\S+\s){5,7}"
即,提取连续的5-7组【任意字符+1个空格】,并会以连续 ...

谢谢了
回复

使用道具 举报

发表于 2015-1-11 09:27 | 显示全部楼层
香川群子 发表于 2015-1-9 16:16
输出部分也可以简化:呵呵

谢谢指点,学习了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 18:28 , Processed in 0.299456 second(s), 13 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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