ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 正则替换实现$1回调的尝试

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-5 19:52 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
去括号

①只有“+”“-”算式里,括号在“+”后面,去括号后,括号里面所有符号不变:
A+(B+C)=A+B+C     例子:9+(2+1)=9+2+1
A+(B-C)=A+B-C     例子:9+(2-1)=9+2-1

②只有“+”“-”算式里,括号在“-”后面,去括号后,括号里面的所有符号变相反:
A-(B-C)=A-B+C     例子:9-(5-1)=9-5+1
A-(B+C)=A-B-C     例子:9-(1+8)=9-1-8

方法对比(推荐testb):
1455.jpg

测试附件:
正则之函数替换.rar (13.53 KB, 下载次数: 77)

评分

6

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-6 14:28 | 显示全部楼层
题目


http://club.excelhome.net/thread-1481398-1-3.html

答案

宏替换指定字符.rar (13.49 KB, 下载次数: 40)

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-1 17:34 | 显示全部楼层
  1. Function 算式(s As Range) As String
  2. With CreateObject("VBScript.RegExp")
  3.   .Global = True
  4.   .IgnoreCase = False
  5.   
  6.   .Pattern = "(材料表\!\$?[A-Z]\$?\d+)"
  7.    算式 = Evaluate("=""" & .Replace(s.Formula, """&qukh(" & """$1""" & ")&""") & """")
  8. End With
  9. End Function

  10. Function qukh(a)
  11.     qukh = Range(a).Offset(0, -8).Value
  12. End Function
复制代码



工程算式.rar (34.08 KB, 下载次数: 39)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-16 20:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 zopey 于 2019-9-16 20:41 编辑

复制代码
  1. Sub pey_testb()
  2. sss = "string=1+count=101;string=1+count=225"
  3. bbb = "count="
  4. kkk = 5

  5. Debug.Print zz(sss, bbb, kkk)
  6. End Sub


  7. Function zz(mystr, qz, bs)
  8. With CreateObject("VBSCRIPT.REGEXP")
  9.     .Global = True
  10.     .Pattern = "(" & qz & ")(\d*)"
  11.    
  12.      zz = Evaluate("=""" & .Replace(mystr, """&  cheng(" & """$1""" & "," & """$2""" & "," & bs & ") & """) & """")
  13. End With
  14. End Function

  15. Function cheng(a, b, c)
  16.     cheng = a & b * c
  17. End Function
复制代码



给定sss ,指定 bbb后面的数字 乘以kkk ,替换回 sss。

TA的精华主题

TA的得分主题

发表于 2019-11-23 22:59 | 显示全部楼层
为何不将正则表达式:
([+|-]?\([\d|+|-]+\))
写成这样:
([+-]?\([\d+-]+\))

是因为“选择结构”执行起来效率高吗?


您的这个“去括号”自定义函数真是巧妙,佩服佩服!
  1. Function qukh(a) 'a-b???????????????
  2.     Select Case Left(a, 1)
  3.          Case "+"
  4.               b = Mid(a, 3, Len(a) - 3)
  5.               If IsNumeric(Left(b, 1)) Then b = "+" & b
  6.          Case "-"
  7.               b = Mid(a, 3, Len(a) - 3)
  8.               b = Replace(b, "+", "t")
  9.               b = Replace(b, "-", "+")
  10.               b = Replace(b, "t", "-")
  11.               If IsNumeric(Left(b, 1)) Then b = "-" & b
  12.          Case "("
  13.               b = Mid(a, 2, Len(a) - 2)
  14.     End Select
  15.     qukh = b
  16. End Function
复制代码


TA的精华主题

TA的得分主题

发表于 2019-11-23 23:20 | 显示全部楼层
  1. Sub pey_testa()
  2.     txt = "1-(-1-((((+2)))+3-4)-(5-1))-(-(+6-7)+7)"
  3. '    txt = "1-((2+3-4)-5)-(6+7)"
  4.     Debug.Print txt
  5.     With CreateObject("VBScript.RegExp")
  6.         .Pattern = "[+|-]?\([\d|+|-]+\)"
  7.         .Global = True
  8.         .IgnoreCase = False
  9.         Do While InStr(txt, "(") > 0
  10.             Set matchs = .Execute(txt)
  11.                 For Each ma In matchs '??????????滻???
  12.                     txt = Replace(txt, ma, qukh(ma))
  13.                 Next ma
  14.             Debug.Print txt
  15.         Loop
  16.     End With
  17. End Sub
  18. Sub pey_testb()
  19. '    txt = "1-(-1-((((2)))+3-4)-(5-1))-(-(6-7)+7)"
  20.     txt = "1-((2+3-4)-5)-(6+7)"
  21.     Debug.Print txt
  22.     With CreateObject("VBScript.RegExp")
  23.         .Pattern = "([+|-]?\([\d|+|-]+\))"
  24.         .Global = True
  25.         .IgnoreCase = False
  26.         Do While InStr(txt, "(") > 0 '???????????滻????
  27.             txt = Evaluate("=" & Chr(34) & .Replace(txt, """ & qukh(" & """$1""" & ") &""") & Chr(34))
  28.             Debug.Print txt
  29.         Loop
  30.     End With
  31. End Sub
复制代码


还是觉得testa好理解一些,testb中:
Evaluate("=" & Chr(34) & .Replace(txt, """ & qukh(" & """$1""" & ") &""") & Chr(34))
还真是让人费解,没搞明白其中引号叠加的道理。

TA的精华主题

TA的得分主题

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

关于:
周老师(ab)
替换为:
周老师(语文、数学)
您的代码中的正则表达式是:
([a-f]*)

我个人感觉应该是:
([a-f]+)

整理学习代码如下:
  1. Public dic
  2. Sub pey_testb()
  3.     Dim brr, k2
  4.     k2 = [h1].End(4).Row - 1
  5.     brr = [h2].Resize(k2, 2)
  6.     Set dic = CreateObject("scripting.dictionary")
  7.     For i = 1 To k2
  8.        dic(brr(i, 1)) = brr(i, 2)
  9.     Next i
  10.     k0 = [c1].End(4).Row - 1
  11.     arr = [c2].Resize(k0, 2)
  12.     With CreateObject("VBScript.RegExp")
  13.         .Global = True
  14.         .IgnoreCase = False
  15.         .Pattern = "([a-f]+)"
  16.         For i = 1 To k0
  17.             For j = 1 To 2
  18.                 txt = arr(i, j)
  19.                 arr(i, j) = Evaluate("=""" & .Replace(txt, """&qukh(" & """$1""" & ")&""") & """")
  20.             Next j
  21.         Next i
  22.     End With
  23.     Cells(2, 11).Resize(k0, 2) = arr
  24. End Sub
  25. Function qukh(a) 'a-b???????????????
  26.     b = dic(Mid(a, 1, 1))
  27.     For i = 2 To Len(a)
  28.         b = b & "??" & dic(Mid(a, i, 1))
  29.     Next i
  30.     qukh = b
  31. End Function
复制代码


您的代码真是奇思妙想,无一行一字之多余,严谨熟练啊。

TA的精华主题

TA的得分主题

发表于 2019-11-24 09:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aoe1981 发表于 2019-11-23 22:59
为何不将正则表达式:
([+|-]?\([\d|+|-]+\))
写成这样:

你的质疑是对的。例如:正则[+|-]表示匹配+,-或|,三种字母之一;匹配+或-可用正则:[+-]或(+|-),但前者的效率更高。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-11-24 09:29 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-11-24 09:33 | 显示全部楼层
aoe1981 发表于 2019-11-23 23:20
还是觉得testa好理解一些,testb中:
Evaluate("=" & Chr(34) & .Replace(txt, """ & qukh(" & """$1" ...

A方案 为普通字符替换,依次进行,前面的替换 可能影响到后面,使结果不对。
所以推荐B方案 ,正则对象应记录了匹配位置信息,一次性完成的整体替换。

正则表达式不会优化,直观写法,最后结果能符合 题目要求 就行。

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-5-20 17:49 , Processed in 0.048031 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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