ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求字符串提取,最好是正则表达式的VBA。

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 09:43 | 显示全部楼层
jbjbzjb 发表于 2014-1-13 23:10
再接着18楼:
还有个很重要的地方要告诉你,即括号的使用。
1.括号不要滥用(估计会降低搜索速度,因为它 ...

一直又读了4遍老师写在 16楼、17楼、18楼的帖子,突然对刚才的问题好象有点理解了:

1、脱字符指的是开头锚定符: ^
(也许也包括结尾锚定符: $   ?)

2、brr(i, 1) = .Execute(theStr)(0).SubMatches(0)    中的.SubMatches(0) 获取的正是括号中建立的子匹配项。因为  pattern="^\d+[A-Z]+\d+[A-Z]+(\d+[A-Z]+)"   中只有一个括号,所以它只建立了一个子匹配:即第三组的数字和字母。所以.SubMatches(0) 用0来对应这一个子匹配。

老师,我这样理解正确吗?
再次感谢老师在16楼、17楼、18楼的讲解,真的受益良多啊!谢谢!
谢谢!

补充内容 (2014-4-2 17:23):
.execute(theStr)(0).SubMatches(0) 获得的是:本次所有匹配.第一个匹配.所有子匹配.第一个子匹配项。

TA的精华主题

TA的得分主题

发表于 2014-1-14 12:57 | 显示全部楼层
jbjbzjb 发表于 2014-1-13 18:22
fdfsddfsdf

请看我强大的多功能正则提取自定义函数:
  1. Function TQ(txt, Optional k = 0, Optional pt = 1)
  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, "")
  9.             ElseIf k > 0 Then
  10.                 TQ = .Execute(txt)(k - 1)
  11.             Else 'k < 0
  12.                 TQ = .Execute(txt)(Int(-k) - 1).SubMatches(Mid(k, InStr(k, ".") + 1) - 1)
  13.             End If
  14.         Else
  15.             TQ = ""
  16.         End If
  17.     End With
  18. End Function
复制代码
自定义函数说明:

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

第二参数【k】:提取模式、兼提取位置
默认k=0时为Replace模式,按pattern进行replace置换
k>0正数时为Matches模式, 返回按pattern提取同类组后第k组的字符结果
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                                              匹配置换数字字符,保留返回英字以及汉字字符。

…………
本题可以采用pattern为:"\d+[a-zA-Z]+"
k参数选=3 (正数为Matches第k组模式)

因此,输入公式=TQ($A5,3,"\d+[a-zA-Z]+")  然后下拉即可。


…………
注意,某些特殊类型可能会导致不符合楼主的要求……
但需要楼主明确规则以后,进行代码补丁修正,但一般说可以达到楼主要求。

TA的精华主题

TA的得分主题

发表于 2014-1-14 13:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如果需要分别提取第3组(第3大组)的数值部分(第1小组)和英字部分(第2小组),
则需要写两个函数如下:

提取第1数值部分=TQ($A5,-3.1,"(\d+)([a-zA-Z]+)")
提取第2英字部分=TQ($A5,-3.2,"(\d+)([a-zA-Z]+)")


结果请看附件:

RegExp.zip

486.8 KB, 下载次数: 39

TA的精华主题

TA的得分主题

发表于 2014-1-14 13:11 | 显示全部楼层
香川群子 发表于 2014-1-14 12:57
请看我强大的多功能正则提取自定义函数:自定义函数说明:

第一参数【txt】:必须,为提取对象字符串或 ...

够强大的.个人以为,正则表达式的使用是在准确/效率/通用与文本特征之间求得平衡.

TA的精华主题

TA的得分主题

发表于 2014-1-14 14:26 | 显示全部楼层
jbjbzjb 发表于 2014-1-13 23:10
再接着18楼:
还有个很重要的地方要告诉你,即括号的使用。
1.括号不要滥用(估计会降低搜索速度,因为它 ...

老师讲得精彩!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-14 21:12 | 显示全部楼层
香川群子 发表于 2014-1-14 13:05
如果需要分别提取第3组(第3大组)的数值部分(第1小组)和英字部分(第2小组),
则需要写两个函数如下:

谢谢老师无私教诲,真是太强大了!一定认真学习!

TA的精华主题

TA的得分主题

发表于 2014-1-15 09:31 | 显示全部楼层
  1. Sub test()
  2. r = Range("a1", [a1].End(4))
  3. With CreateObject("VBSCRIPT.REGEXP")
  4.   .Pattern = "(\d+\D+){2}(\d+\D+).*"
  5.   For i = 1 To UBound(r)
  6.     r(i, 1) = .Replace(r(i, 1), "$2")
  7.   Next
  8.   Range("b1").Resize(UBound(r)) = r
  9. End With
  10. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-15 13:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Zamyi 发表于 2014-1-15 09:31

老师!答案非常正确,正是我想要的!非常感谢!

老师,能不能帮忙解释一下这句啊:

.Replace(R(I, 1), "$2")

这里面的美元符号和数字2代码的是什么啊?非常期待您的讲解!谢谢!

TA的精华主题

TA的得分主题

发表于 2014-1-15 14:12 | 显示全部楼层
yyyydddd8888 发表于 2014-1-15 13:49
老师!答案非常正确,正是我想要的!非常感谢!

老师,能不能帮忙解释一下这句啊:

jbjbzjb已经说了好多,就是Pattern 里面的括号,叫做组,在Pattern中可以用\1、\2...引用, 在Replace中可以用$1、$2、$3...引用。其实加括号是把它放入内存里,占用更多的内存,速度上不见得变慢。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-15 21:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Zamyi 发表于 2014-1-15 14:12
jbjbzjb已经说了好多,就是Pattern 里面的括号,叫做组,在Pattern中可以用\1、\2...引用, 在Replace中可 ...

谢谢Zamyi老师的讲解,听了老师的讲解,真如醍醐灌顶啊!真是晃然大悟啊!

太感谢您了!
谢谢!
谢谢!
谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 10:26 , Processed in 0.035834 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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