ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-2-3 10:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

今天才拜读这个帖子。
试着玩了一些其他条件的,
比如:
字符串:"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 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
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 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
ykqrs 发表于 2021-2-3 14:44
大师您好,以下代码可否简化?

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

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-19 14:05 | 显示全部楼层
我做练习1'小计之后的数字之和。
Sub Test1()
    Dim r&, ar, Reg As Object, br, ss$, mas As Object, ma As Object, v#, Start%, Length%, i&
    r = Cells(Rows.Count, 1).End(xlUp).Row
    With Range("A1").Resize(r)
        .Font.Bold = False
        .Font.Color = 0
        ar = .Resize(, 2).Value
    End With
    ReDim br(2 To r, 1 To 1)
    Set Reg = CreateObject("VBScript.RegExp")
    With Reg
        .Global = True
        .Pattern = "小计\d+\.?\d*"
        For i = 2 To r
            ss = ar(i, 1)
            Set mas = .Execute(ss)
            For Each ma In mas
                Start = ma.FirstIndex + 2
                Length = ma.Length - 2
                v = Val(Right(ma, Len(ma) - 2))
                br(i, 1) = br(i, 1) + v
                With Range("A" & i).Characters(Start, Length).Font
                    .Bold = True
                    .Color = vbBlue
                End With
            Next
        Next
    End With
    Range("B2").Resize(r - 1) = br
End Sub

VBS正则练习题——标记并提取成对括号内的数值求和 .rar

21.9 KB, 下载次数: 3

TA的精华主题

TA的得分主题

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

Sub test1() '要求一次提取括号内单个数字紧跟单个非数字7e-5k-9z
Dim s$, ss, n&, fi&, j&, pttn$, tmp$
sr = "1a20s3ewww5(7e82d9gg5k)3c5h6u(9z)"
With CreateObject("vbscript.regexp")
     .Pattern = "\(([^\(\)]+)\)"
     .Global = True
     
  Set mh = .Execute(sr)
      For Each mt In mh
        .Pattern = "(?:\D)\d\D(?=\d|\))"
        Set mhh = .Execute(mt)
          For Each mtt In mhh
             ssrr = Right(mtt, Len(mtt) - 1)
             asr = asr & "-" & ssrr
          Next
      Next
      asr = IIf(Left(asr, 1) = "-", Right(asr, Len(asr) - 1), asr)
      MsgBox asr
End With
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 14:32 , Processed in 0.034686 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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