ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [第127期]替换特定规则范围内的字符[已总结评分]

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-6-20 23:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. =REDUCE(A2,TOCOL(ROW($1:$10)-1&TOROW(LEFT("eeee",ROW($1:$4))))&TOROW(ROW($1:$10)-1),LAMBDA(x,y,SUBSTITUTE(x,y,SUBSTITUTE(y,"e",2))))
复制代码

用了超人老师的方法,字符力减呀。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

TA的精华主题

TA的得分主题

发表于 2024-6-12 20:17 来自手机 | 显示全部楼层
=regexp(a2,"(?<=\de*)e(?=e*\d)",2,"2")

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-13 02:19 | 显示全部楼层
本帖最后由 ggmmlol 于 2024-6-13 06:56 编辑

测试了Office365的正则替换函数REGEXREPLACE,发现其2个不足之处:
1、虽然支持逆序零宽断言(?<=exp)、(?<!exp),但这两种零宽断言中的exp都必须是匹配确定有限长度的表达式。所以,想套用42楼的正则表达式,公式 =REGEXREPLACE(A2,"(?<=\de*)e(?=e*\d)","2") ,得到的结果为#VALUE!  其错误提示为“正则表达式编译器错误”,具体原因为“lookbehind断言的长度不受限制”。这说明其所引用的正则引擎功能偏弱,不是功能最强大的C#的正则引擎。
2、如本主题的实例,要在第一捕获分组的内容后面添加一个数字2,则替换的内容写"$12",但是REGEXREPLACE函数会把"$12"解释为“第十二个”捕获分组,显然,这个实例的正则表达式中并不会出现12个捕获分组,于是,返回的结果也是 #VALUE!  ,其错误提示为“正则表达式匹配错误”,具体为“未知子字符串”。这一点上,甚至不如功能最基础的VBScript正则引擎做的好。后者对于捕获的子字符串,只允许1位数字表示,即只能为1-9,这虽然限制了同一个正则表达式中的捕获分组的数量最多不超过9个(在EXCEL的数据中,9个捕获子串,这足够用了),但不会导致前述把"$12"识别为第12个子字符串的问题。

最后,对于本主题的实例,使用REGEXREPLACE函数,因为其上述两项不足,其鸡肋一般的逆序零宽断言的功能用不上了,仍只好套用我前面总结的“万能公式”来处理,因此又需要把"$12"改成"$1_2"来避免对子字符串项的识别错误,最后还要把"_2"替换回“2”,最后的公式为:
=SUBSTITUTE(REGEXREPLACE(REGEXREPLACE(A2,"((?:(?:[^\de]|^)e+|.*?)+)(e(?=e*\d)|$)","$1_2"),"_2_2$",""),"_2","2")

而使用VBScript正则引擎自定义的REGREPLACE函数,公式是:
=REGREPLACE(REGREPLACE(A2,"((?:(?:[^\de]|^)e+|.*?)+)(e(?=e*\d)|$)","$12"),"22$","")

在WPS中的公式,=REGEXP(A2,"(?<=\de*)e(?=e*\d)",2,"2")  不会出现#VALUE!,但是返回的值是A2原文本内容,没有任何变化。所以,现在WPS的正则函数的逆序零宽断言中,也是不支持表达式的长度不受限制的。

看来,要想拥有最强的正则函数,还是要用C#或VB.Net开发VSTO插件,引用最强大的.net的正则引擎,自定义拥有各项最新特性的正则函数。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-8-19 21:37 | 显示全部楼层
凑个热闹。
Sub 例7() '将两个数字间的"e",改为"2"
Dim s$, ss, n&, fi&, j&, pttn$, tmp$
On Error Resume Next
Range("b22:b27") = Range("A22:A27").Value
Set regx = CreateObject("vbscript.regexp")
     regx.Pattern = "\d(e+)(?=\d)"
     regx.Global = True
       For i = 22 To 27
         sr = Cells(i, 2).Value
         Set mh = regx.Execute(sr)
         For Each mt In mh
             St = mt.firstindex + 2
             Lh = mt.Length - 1
            ' Cells(i, 2).Characters(St, Lh).Text = String(Len(Mid(sr, St, Lh)), "2")
             With Cells(i, 2).Characters(St, Lh)
                  .Text = String(Len(Mid(sr, St, Lh)), "2")
                  .Font.Bold = True
                  .Font.Color = vbRed
             End With
          Next
       Next
End Sub

TA的精华主题

TA的得分主题

发表于 2024-8-20 19:23 | 显示全部楼层
ykqrs 发表于 2019-12-16 17:50
'我试着解读一下式三,不正确不足之处请ggmmlol老师指正。
reg.Pattern = "((?:(?:[^\de]|^)e+[\d\D]*?)*) ...

解释不错,今天没有分数可给,只可有种表示敬佩和感谢了。谢谢你对普及正则知识所做出的努力和奉献。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 16:50 , Processed in 0.026821 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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