ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] VBS正则练习题——标记并提取成对括号内的数值求和

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-2-3 10:47 | 显示全部楼层

今天才拜读这个帖子。
试着玩了一些其他条件的,
比如:
字符串:"1a20s3ewww5(7e82d9gg5k)3c5h6u(9z)"
要求一次提取括号内单个数字紧跟单个非数字
7e-5k-9z
写了好几个,都经不起测试,老师有时间写一个,谢谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-3 11:12 | 显示全部楼层
ykqrs 发表于 2021-2-3 10:47
今天才拜读这个帖子。
试着玩了一些其他条件的,
比如:

这个练习题,只为了练习VBScript.Regexp引擎对于“逆序零宽断言”问题的处理方法,为了简化问题而突出方法,例子中的括号都是规定为全角括号的。你把字符串的括号改成如下全角形式的,再测试看看:
1a20s3ewww57e82d9gg5k3c5h6u9z

TA的精华主题

TA的得分主题

发表于 2021-2-3 14:44 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ggmmlol 发表于 2021-2-3 11:12
这个练习题,只为了练习VBScript.Regexp引擎对于“逆序零宽断言”问题的处理方法,为了简化问题而突出方 ...

大师您好,以下代码可否简化?
  1. Sub qq()
  2. Dim str$, re As Object, mh As Object, s
  3. str = "(1ha2s)3ewww5(7e82d9gg5k)3c5h6u(9z)"
  4. '取出括号内单数字+非数字组合,比如3y,9他。。。。。
  5. MsgBox str
  6. Set re = CreateObject("VBSCRIPT.REGEXP")
  7. re.Global = True
  8. re.Pattern = "(?:\d{2,}\D|\d[^\d)]{2,}|(?:)|^)[^(]*|[\d\D]*?)*(\d((?![\d)]).)(?=[^()]*))|$)"
  9. Set mh = re.Execute(str)
  10. s = re.Replace(str, "$1-")
  11. MsgBox s
  12. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-3 16:04 | 显示全部楼层
ykqrs 发表于 2021-2-3 10:47
今天才拜读这个帖子。
试着玩了一些其他条件的,
比如:

明白你所说的“单个数字紧跟单个非数字”了,它是以下表达式所匹配的第一个捕获分组的内容:
\D(\d\D)(?!\d)
结合另一个条件"在直接配对的括号内",正则表达式的最终结果如下:

(?:(?:\)|^)[^\(]*|[\d\D]*?)*(?:\D(\d\D)(?=(\d[^\(]*)?\))|$)

编写过程如下:
  1. Sub 取直接配对括号内的单个数字接单个非数字()
  2.     s$ = "1a20s3ewww5(7e82d9gg5k)3c5h6u(9z)"
  3.     pttn$ = "(?:eXp1|[\d\D]*?)*(?:eXp0|$)" '万能公式变体形式,其中,eXp0包含有对目标字符的捕获分组
  4.    
  5.     eXp0$ = "\D(\d\D)(?=(\d[^\(]*)?\))" '目标字符:右括号之前的单个数字紧接非数字
  6.     eXp1$ = "(?:\)|^)[^\(]*" '必须显式排除的例外项:从右括号(或字符串开始位置)直到左括号之前的字符
  7.    
  8.     pttn = Replace(Replace(pttn, "eXp1", eXp1), "eXp0", eXp0) '代入万能公式
  9.     Debug.Print pttn
  10.    
  11.     Set reg = CreateObject("VBScript.RegExp")
  12.     reg.Global = True
  13.     reg.Pattern = pttn
  14.     s = reg.Replace(s, "$1-")
  15.     s = Replace(s, "---", "")
  16.     Debug.Print s
  17. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-2-3 16:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
ykqrs 发表于 2021-2-3 14:44
大师您好,以下代码可否简化?

re.Pattern = "(?:(?:)|^)[^(]*|[\d\D]*?)*(?:\D(\d\D)(?=(\d[^(]*)?))|$)"

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-25 23:09 , Processed in 0.040437 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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