|
楼主 |
发表于 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
查看全部评分
-
|