ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 初学者用 强大的多功能 【正则提取字符用】自定义函数

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-14 13:28 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
本帖最后由 香川群子 于 2014-1-15 23:08 编辑
  1. Function TQ(txt$, Optional k = 0, Optional pt = 1, Optional s$ = "")
复制代码
自定义函数说明:

第一参数【txt】:必须,为提取对象字符串或其单元格引用地址

第二参数【k】:提取模式、兼提取位置
  ①        默认k=0【零】时为Replace模式,按pattern进行replace置换      置换结果按第四参数s,该s参数默认="",即把正则匹配结果直接置换去掉。
                                          如果该参数=其它字符,那么置换结果为指定字符s内容
      但如果是特殊字符$1、$2……这样的,代表按正则提取的第n组结果内容进行置换

  ②-1
        k>0【正整数】时为Matches模式, 返回按pattern提取同类组后第k组的字符结果
  ②-2
       k>0 且含小数点[.]时,直接提取全部Matches结果,并转入数组a后 join合并输出。一般都输入k=1.1即可。


  ③-1
       k<0 【负整数】时为SubMatches模式,返回pattern提取后指定大组对应的小组的全部字符结果,并转入数组b后 join合并输出。
  ③-2        
       k<0且含小数点[.]时【负小数】时为SubMatches模式,返回按多组pattern提取后[整数部分]大组的[小数部分]小组的字符结果
      
       整数部分为:Int(-k) - 1)
      小数部分未:Mid(k, InStr(k, ".") + 1) - 1
    如k=-3.1 即为提取第3组的第1小组部分字符 → 3.1


第三参数【pt】:正则pattern,输入或默认常用pattern
该参数为1-7的有效数值时,使用默认预置的常用pattern效果如下:
参数pt        pattern                                 效果
=1      \w or [0-9a-zA-Z] or [a-zA-Z0-9]   匹配置换英数字符,保留返回文字字符。
=2      [^a-zA-Z]                                   匹配置换非英字符,保留返回英文字符。
=3      \D                                              匹配置换非数字符,保留返回数字字符。
=4      [^a-z]                                        匹配置换非小写英字,保留返回小写英字符。
=5      [^A-Z]                                       匹配置换非大写英字,保留返回大写英字符。
=6      \W or [^0-9a-zA-Z]                      匹配置换非英非数字,保留返回英数字符。
=7      \d                                              匹配置换数字字符,保留返回英字以及汉字字符。

增加了第四参数【s】: 置换时,可选择置换结果,默认="" 即直接置换掉。
也可以置换为自己需要的内容,
或者进行组置换如 "$1" 或 "$2"等


以上


评分

19

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 13:31 | 显示全部楼层
本帖最后由 香川群子 于 2014-1-15 23:09 编辑

本帖虽然只是面向初学者用的正则练习用自定义函数,但功能多、调试方便,非常具有实用性。

建议立即收录到知识树中去……

  1. Function TQ(txt$, Optional k = 0, Optional pt = 1, Optional s$ = "")

  2.     If IsNumeric(pt) Then pt = Choose(pt, "\w", "[^a-zA-Z]", "\D", "[^a-z]", "[^A-Z]", "\W", "\d")
  3.     With CreateObject("VBScript.RegExp")
  4.         .Global = True
  5.         .Pattern = pt
  6.         If .test(txt) Then
  7.             If k = 0 Then
  8.                 TQ = .Replace(txt, s)
  9.             ElseIf k > 0 Then
  10.                 If InStr(k, ".") Then
  11.                     Set Ma = .Execute(txt)
  12.                     ReDim a(0 To Ma.Count - 1)
  13.                     For Each m In Ma
  14.                         a(c) = m: c = c + 1
  15.                     Next
  16.                     If s = "" Then s = " "
  17.                     TQ = Join(a, s)
  18.                 Else
  19.                     TQ = .Execute(txt)(k - 1)
  20.                 End If
  21.             Else 'k < 0
  22.                 If InStr(k, ".") Then
  23.                     TQ = .Execute(txt)(Int(-k) - 1).SubMatches(Mid(k, InStr(k, ".") + 1) - 1)
  24.                 Else
  25.                     Set sMa = .Execute(txt)(-k - 1).SubMatches
  26.                     ReDim b(0 To sMa.Count - 1)
  27.                     For Each m In sMa
  28.                         b(c) = m: c = c + 1
  29.                     Next
  30.                     If s = "" Then s = " "
  31.                     TQ = Join(b, s)
  32.                 End If
  33.             End If
  34.         Else
  35.             If k = 0 And s = "" Then TQ = txt Else TQ = ""
  36.         End If
  37.     End With
  38. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 13:36 | 显示全部楼层
初学者开始学习正则时,
往往因为对正则的pattern语法和各种提取方法不熟悉,心存畏惧……

又因为对pattern规则理解不透,常常会丢三落四、顾此失彼。

此时,代码的调试就是一个常态,需要反复进行。

因此,我的自定义函数,很好地弥补了这个缺陷:
支持在Excel工作表写入自定义函数后,随时调整Pattern参数或各种正则提取模式
可以在不同的单元格中进行不同pattern和不同模式的结果比较,效果非常之好。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 13:57 | 显示全部楼层
本帖最后由 香川群子 于 2014-1-15 23:32 编辑

附件是几个简单应用示例

RegExp.zip (8.85 KB, 下载次数: 2103)

附件有更新、增加了第4参数。


基本上正则VBA的所有代码处理方法都在里面了。

可根据具体要求,修改、剪切其中必须的部分,改写成Sub过程,就是一个很好的应用了。

但正则最难也是最出彩的,在于Pattern语法的构思。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-1-14 14:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
{:soso_e179:}

TA的精华主题

TA的得分主题

发表于 2014-1-14 14:14 | 显示全部楼层
很厉害的“想穿裙子”!真及时啊--正想用字符串提取,妳就来了。非常感谢!

TA的精华主题

TA的得分主题

发表于 2014-1-14 14:53 | 显示全部楼层
好贴,收藏了,谢谢分享。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 15:14 | 显示全部楼层
新农夫 发表于 2014-1-14 14:14
很厉害的“想穿裙子”!真及时啊--正想用字符串提取,妳就来了。非常感谢!

这个函数只是个方便调试用的工具,相当于在VBA模块和工作表之间建立了一个快速通道……

而正则要用得好,还是要靠自己多钻研、多向各位高手请教。

TA的精华主题

TA的得分主题

发表于 2014-1-14 16:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-2-12 11:12 | 显示全部楼层
适合用作正则学习、正则表达式测试、调试用。

虽然早已有强大的正则表达式测试工具,
但使用我的自定义函数可以批量返回结果,
或同时返回多个不同正则表达式的不同结果,可以用来比较结果……

因此,对初学者来说非常实用。

评分

2

查看全部评分

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

本版积分规则

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

GMT+8, 2024-12-31 01:49 , Processed in 0.036133 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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