ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-13 18:37 | 显示全部楼层
yyyydddd8888 发表于 2014-1-13 18:25
真是大神啊!答案全部正确!太感谢了!谢谢!谢谢!

还是有点逻辑不清,原本集合只有一个,没必要通过循环来取!

7楼附件已更新。

TA的精华主题

TA的得分主题

发表于 2014-1-13 18:42 | 显示全部楼层
yyyydddd8888 发表于 2014-1-13 18:26
哦!谢谢您了!

这种办法想取哪个匹配值就取哪一个,不需要大改程序。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-13 19:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jbjbzjb 发表于 2014-1-13 18:37
还是有点逻辑不清,原本集合只有一个,没必要通过循环来取!

7楼附件已更新。

哦,谢谢老师!我马上去看看。太谢谢您了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-13 19:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
chxw68 发表于 2014-1-13 18:42
这种办法想取哪个匹配值就取哪一个,不需要大改程序。

哦,一定好好向老师们学习,谢谢您了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-13 19:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jbjbzjb 发表于 2014-1-13 18:37
还是有点逻辑不清,原本集合只有一个,没必要通过循环来取!

7楼附件已更新。

老师现在的代码更加简练了!  .execute(thestr)(0)是什么意思啊?

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:14 | 显示全部楼层
yyyydddd8888 发表于 2014-1-13 19:46
老师现在的代码更加简练了!  .execute(thestr)(0)是什么意思啊?

答:
1.类似“简练”这样的说法欠妥,“简练”却不周到,“简练”却晦涩难懂,,“简练”却算法不科学,谈不上什么好代码;
2.关于.Execute(theStr)(0)的问题描述如下:
(1)首先,.Execute是正则的方法(亦或叫函数?),即按指定的Pattern准则搜索目标字符串,找出符合Pattern特征的所有匹配项,因为是“所有”的匹配项,故该方法返回的是一个集合,该集合的项目有可能仅一项,也可能多项,其集合中项目对应的下标一律从0开始;
(2)比如Pattern指定为“.Pattern = "\d+[A-Z]+\d+[A-Z]+\d+[A-Z]+" ”,那么对于字符串theStr “ 7K13R14H14U1GE7J5G14V2Q12I15H218CU ”,符合的匹配项计有:
7K13R14H
14U1GE7J
5G14V2Q
12I15H218CU
它们分别对应着集合中的0、1、2和3,若用Set theMatches=.Execute(theStr)来获得所有的匹配项,则theMatches(0)对应着7K13R14H,theMatches(1)对应着14U1GE7J等,当然了,若用.Execute(theStr)(0)和.Execute(theStr)(1)来分别表示7K13R14H和14U1GE7J也不是不可,但有谁用这么土的方法去获取多个子匹配项呢,获取多个子匹配项的最佳方法显然是用For结构循环来获取,比如:
Set theMatches=.Execute(theStr)
For Each theMatch in theMatches
   Msgbox theMatch
Next theMatch
(3)事实上,正则的关键之处在于Pattern的定义,就你的本例来说,附件中的代码.Global=True语句是多余的,此外,Pattern中的前置脱字符“^”也是多余的,完全可以去除,其中道理不想说了,打了这么多字,发现依然没把想说的说清楚,烦了。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-1-13 22:34 | 显示全部楼层
本帖最后由 jbjbzjb 于 2014-1-13 22:51 编辑

再接着16楼的内容说吧:

如果理解了.Execute方法返回的是一个集合,取得集合中的要素是通过其下标来获得,那么,你本例可以把Pattern设成如下:
.Pattern="\d+[A-Z]+"
但这样一来,显然就有很多的符合这个特征的项了,仅1个至2个符合此特征的显然不符合你的要求,故代码要作相应变化,比如判断下集合中的个数:
Set theMatches=.Execute(theStr)
If theMatches.Count>2 Then MsgBox theMatches(2) '注意下标从0开始,故第3个匹配项的下标是2!

或者写成这样看似简练,其实很狗屁的不好懂的、进行了两次Execute的语句:

If .Execute(thestr).Count>2 Then MsgBox .Execute(theStr)(2)

简单吧?!不仅省了定义集合变量theMatches,也省了Set语句,其实,我还是那话,这种写法狗屁极了!!!

如上所述,把Pattern定义为.Pattern="\d+[A-Z]+"是极端狗屁的啦,因为,此法不仅非得要设置.Global=True,更要命的是正则引擎要做很多次无意义的搜索,因为,很显然,“数字字母”这样特征的字符串连在一起连续达到3个的就是你要的目标,何苦为了所谓的简练写法让正则引擎疲于奔命呢?

TA的精华主题

TA的得分主题

发表于 2014-1-13 23:10 | 显示全部楼层
再接着18楼:
还有个很重要的地方要告诉你,即括号的使用。
1.括号不要滥用(估计会降低搜索速度,因为它要建立子匹配,不知道“子匹配”的说法是否准确);
2.再次强调,只有存在括号,才存在子匹配;
3.正如第1、第2点所述,不知你发现没有,我附件中的就犯了滥用括号的毛病,即只要目标那个字符串设为子匹配就行了,即:.Pattern = "^\d+[A-Z]+\d+[A-Z]+(\d+[A-Z]+)",代码中相应的语句对应着改一下:
brr(i, 1) = .Execute(theStr)(0).SubMatches(0)
4.借此楼说下,有了脱字符,本例不要.Global=True语句了,此外,前述也表明,默认情况下,.Global的值是False的,故连脱字符也可以不要!

结论:上述表明Pattern的定义非常非常重要,不是胡乱定义一下达到目的就可以的,事实上,Pattern的定义准确要经历不少的时间历练才能越来越“精”!所以,写Pattern都问自己几个这么写成了吗?抱着“只有更好,没有最好”的心态去书写它,你才从中得到趣味。

说着说着跑题了不是?!不扯淡了,走人哉!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-1-13 23:17 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
jbjbzjb 发表于 2014-1-13 23:10
再接着18楼:
还有个很重要的地方要告诉你,即括号的使用。
1.括号不要滥用(估计会降低搜索速度,因为它 ...

高手呀,我正则学习中

TA的精华主题

TA的得分主题

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

高手啊!老师讲得太深刻了!从你的解释中学到不少东西!  谢谢您!

再请问您一个问题行吗?
18楼中提到的“脱字符”是什么啊?
.SubMatches(0)   又表示什么呢?

再次期盼老师的精彩讲解!谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 10:42 , Processed in 0.039551 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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