ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 正则提取应用的实例

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-24 12:50 | 显示全部楼层 |阅读模式
昨天,交流群有兄弟提到用VAL不能把只有数字的字符串转换成数值的问题,一看就知道字符串里有不可见的字符导致转换失败,于是说应该用正则来提取。个人来说,正则写得不怎么样,所以都是把一些常用的记录到我的笔记里的,于是我又贴了我的笔记出来,但今天早上,那兄弟突然问我怎样把我的代码可以应用起来,(有点点纳闷……)

现在修改了一下,做成一个实例给各位初学者参考,至于哪些正则高手就不要来耻笑了哈,但可以提出更好的建议或者做法或者纠正指正,先谢谢了。
  1. Sub 正则提取应用()
  2.     Dim vData As Variant, sStr As String, vNum As Variant, nI As Integer
  3.    
  4.     sStr = "ab知道(12.6-3.4)收到"
  5.     vData = 正则提取(sStr, 11) '得到各数字形式的字符串
  6.     ReDim vNum(1 To UBound(vData))
  7.     For nI = 1 To UBound(vData)
  8.         vNum(nI) = Val(vData(nI)) '把数字形式字符串转换成数值
  9.     Next
  10. End Sub

  11. Private Function 正则提取(ByVal sStr As String, nType As Integer) As Variant
  12. 'nType 提取的是第几种类型
  13.     Dim oData As Object, oItem As Object, vData As Variant, nData As Integer
  14.     Dim regExp As Object
  15.     Dim vPattern As Variant, sPattern As String
  16.     Dim vReplace As Variant

  17.     sPattern = "|" & "[0-9]" '1、单个纯数字为关键字
  18.     sPattern = sPattern & "|" & "[0-9]+" '2、多个纯数字为关键字
  19.     sPattern = sPattern & "|" & "\d" '3、单个纯数字为关键字
  20.     sPattern = sPattern & "|" & "\d+" '4、多个纯数字为关键字
  21.     sPattern = sPattern & "|" & "[^0-9]" '5、单个非数字为关键字
  22.     sPattern = sPattern & "|" & "[\u4e00-\u9fa5]" '6、单个汉字为关键字
  23.     sPattern = sPattern & "|" & "[\u4e00-\u9fa5]+" '7、多个个汉字为关键字
  24.     sPattern = sPattern & "|" & "[^\u4e00-\u9fa5]" '8、单个非汉字为关键字
  25.     sPattern = sPattern & "|" & "\D+" '9、汉字,字母,符号等为关键字
  26.     sPattern = sPattern & "|" & "[^a-zA-Z]" '10、汉字,数字,符号等为关键字
  27.     sPattern = sPattern & "|" & "\d+(?:\.\d+)?" '11、数值形式(含小数)为关键字
  28.     sPattern = sPattern & "|" & "(\d+(?:\.\d+)?-\d+(?:\.\d+)?)" '12、(数值-数值)  形式为关键字,结果不含括号
  29.     sPattern = sPattern & "|" & "\(\d+(?:\.\d+)?-\d+(?:\.\d+)?\)" '13、(数值-数值)  形式为关键字,结果含括号
  30.     sPattern = sPattern & "|" & "工\d+(?:\.\d+)?" '14、工字开头+数值形式(含小数)为关键字
  31.     sPattern = sPattern & "|" & "[\u5de5]\d+(?:\.\d+)?" '15、工字开头+数值形式(含小数)为关键字,注意前面中括号内是工字的UniCode码
  32.     vPattern = Split(sPattern, "|") '分离出各种功能语句
  33.     ReDim vReplace(1 To UBound(vPattern) + 1) '清空关键字的结果保存
  34.     vReplace(UBound(vReplace)) = "[^|]+" '用|作为分离对象
  35.    
  36.     Set regExp = CreateObject("Vbscript.RegExp")
  37.     With regExp
  38.         .Global = True '设置全局可用性。 决定是匹配全局!!还是匹配首字位!
  39.         .IgnoreCase = True '忽略字母大小写
  40.         If nType > 0 And nType <= UBound(vPattern) Then
  41.             .Pattern = vPattern(nType) '正则分离语句
  42.             vReplace(nType) = .Replace(sStr, "") '对字符串进行关键字类型内容去掉
  43.             Set oData = .Execute(sStr) '对字符串进行以关键字类型内容进行提取成对象
  44.             If oData.Count > 0 Then
  45.                 ReDim vData(1 To oData.Count)
  46.                 nData = 0
  47.                 For Each oItem In oData
  48.                     nData = nData + 1
  49.                     vData(nData) = oItem
  50.                 Next
  51.             End If
  52.         ElseIf nType = 0 Then
  53.         '针对拆分(??.?-??.?)拆分里面数值
  54.             .Pattern = "\((\d+(?:\.\d+)?)-(\d+(?:\.\d+)?)\)"
  55.             Set oData = .Execute(sStr)
  56.             With oData(0)
  57.                 ReDim vData(1 To .SubMatches.Count)
  58.                 For nData = 1 To .SubMatches.Count
  59.                     vData(nData) = .SubMatches(nData - 1) '获取子匹配
  60.                 Next
  61.             End With
  62.         Else
  63.             vData = Empty '说明超出上面已经固化下来的提取类型
  64.         End If
  65.     End With
  66.     正则提取 = vData
  67. End Function
复制代码


正则提取应用(by.micro).rar

17.81 KB, 下载次数: 182

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-24 14:41 | 显示全部楼层
谢谢分享   学习       .................    虽然看不懂

TA的精华主题

TA的得分主题

发表于 2018-8-24 15:03 来自手机 | 显示全部楼层
正则表达式中,他们说 尽量少用元字符 |   你不但用了而且用得还很多!用这个元字符的时候一定要注意哦!注意点有好几个地方哦!

TA的精华主题

TA的得分主题

发表于 2018-8-24 15:15 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-24 15:57 | 显示全部楼层
duquancai 发表于 2018-8-24 15:03
正则表达式中,他们说 尽量少用元字符 |   你不但用了而且用得还很多!用这个元字符的时候一定要注意哦!注 ...

多谢一向以来指点。有机会我再去西安,约你去看望杨贵妃啊

TA的精华主题

TA的得分主题

发表于 2019-10-3 16:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不用写VBA,用Excel网络函数库也可以直接使用RegexString()正则表达式函数精确提取数字。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-3 16:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ExcelAPInet 发表于 2019-10-3 16:13
不用写VBA,用Excel网络函数库也可以直接使用RegexString()正则表达式函数精确提取数字。

多谢广告式的指导

TA的精华主题

TA的得分主题

发表于 2019-10-5 10:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-12-6 16:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-6-4 20:02 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-3-29 21:31 , Processed in 0.072794 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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