excel的vbscript正则表达式自定义函数

请教下,excel的vbscript正则表达式自定义函数
最新回答
失心疯〆

2024-11-04 04:53:33

在Excel中,使用VBScript正则表达式自定义函数是历史悠久的功能,网上有许多类似的自定义函数,主要针对单个文本处理,通常只需四五行代码即可完成。然而,WPS在2024年4月推出regexp函数后,有开发者仿照其参数,编写了一个自定义函数,利用VBA中VBScript的正则表达式功能,增加了对数组、单元格、文本等多种数据的处理能力。这种自定义函数的代码行数较多,但仍然在非office365测试通道及vol版本的Excel中具有实用价值。

以下是用于复制粘贴到VBE环境模块中的函数代码示例:

函数参数说明如下:

参数1:findin,可以是文本或单元格。若为多个单元格,findwhat必须是文本,返回横向结果。

参数2:findwhat,其正则表达式可以是文本、横向数组或纵向单元格。若为文本,可横向返回多个匹配结果;若为数组或单元格,且每个表达式有多个结果,函数返回第一个结果,横向输出。

参数3:可选参数,有三种模式:0为匹配模式(execute),1为替换模式(replace),2为测试模式(test),默认值为0。

参数4:替换值,支持文本和正则表达式。

参数5:当有多个值匹配时,返回第几个值,默认值为0,返回所有值。

参数6:是否忽略大小写,默认值为true。

在实际应用中,可以通过以下示例来理解函数的使用:

按单字符展开,横向展开:

=TOCOL(regexp(A3,"."))

获取多个单元格中的值,横向输出第一个值:

=regexp(A40:A42,"[0-9.-]+")

处理单个单元格时,可横向输出所有匹配的值:

=regexp(A42,"[0-9.-]+")

返回的多个值默认为文本值,若需要累加,需先转换为数值,再求和:

=SUM(--regexp(A40,"[0-9.-]+"))

批量提取中文:

=regexp(A51,"[一-龟]+")

批量提取非中文:

=regexp(A51,"[^一-龟]+")

按多个分隔符拆分:

=regexp(A74,"[^*/-]+")

提取最后一个指定字符之前的内容(不含):

=regexp(A99,"^.*(?=\\)")

替换掉括号中的内容:

=regexp(A144,"([(\(][^()]*[一-龟]+[^()]*[\))])|(【.*?】)",2,"")

注意,函数不支持某些特定符号,如需获取数据后去掉最前面的部分,应使用:

=regexp(A130,"(?:[^一-龟\w])([一-龟]\w+)")

第二参数可以是数组,支持数组输出:

=regexp(A139,{"[^一-龟]+","[一-龟]+"})

第二参数支持多个单元格,如:

=regexp(A143,D143:D144)

批量提取不连续简称的全称:

=TOCOL(regexp($A$147:$A$148,".*"®exp(B147,"(.)",2,"$1.*")),3)

在WPS的正则表达式中,使用/1表示查找部分正则表达式中的第一个括号中的部分;在word的通配符中,同样使用/1。而在Excel中,全部使用$1。

由于不支持某些特定符号(如?<=),在替换时只能获取数据后去掉最前面的部分。例如,函数的使用示例:

=regexp(A171,"(?=\d)(?=(?:\d{3})+($|[^\d年]))",2,",")

以上展示了Excel中VBScript正则表达式自定义函数的强大应用,通过灵活的参数配置,可以实现复杂的文本处理任务。