一个可以使用多个正则表达式进行多次尝试匹配,并进行替换的excelvba自定义函数(ufd)

hejing195 hejing195     2022-09-17     369

关键词:

该自定义函数可使用多个正则表达式对目标单元格进行多次匹配尝试,如匹配成功,将停止尝试匹配其他正则表达式,并且使用该正则表达式相对应的替换表达式进行替换,返回替换结果。

您可以直接下载包含该函数代码的XLSM文件,打开并启用宏之后,就可以直接使用该函数:http://url.cn/5WVPvgT

使用方法为:

Text参数:需要进行处理的原始文字或单元格。

MatchPatternRange参数:正则表达式组所在的单元格范围。请将多个正则表达式存放在表格中的一行或一列内,作为MatchPatternRange参数传入。

ReplacePattern参数:每个正则表达式相对应的替换字串符所在的单元格范围。请将用来作替换的文字放在正则表达式隔壁的行或列内,作为ReplacePatternRange参数传入。

IgnoreCase参数:在查找时是否忽略大小写,默认值为True,即忽略大小写区别。

 

如需在输入函数时获取参数提示,可以按Shift+F3,打开插入函数对话框,并在函数类别(category)中找到用户自定义(User Defined),在下方文本框中找到RangeRegexReplace,再点击OK,就会弹出参数输入辅助界面。

 

 

如果您想学习一下如何自己插入VBA源代码,可以按照以下方法将下文中的VBA代码插入Excel工作簿:

先在Excel中按Alt+F11,进入VBE编辑器。然后在左侧找到需要插入代码的工作簿(Workbook)的名称。如果VBE编辑器左侧看不到这一块Project小窗口,可以试试看按Ctrl+R。

在下图中,我希望在工作簿Book1中插入代码,所以就选中了VBAProject (Book1)这一层。

右键单击该工作簿名称,依次点击Insert -- Module。

这时VBE左侧就会多出一个Module1,双击该Module1,在右侧代码输入界面中,将本文下面的代码复制粘贴进去。

 

本自定义函数由于使用了第三方库,使用前需要做Early Binding:即在VBE编辑器中,选择菜单栏中的Tool — Reference:

弹出如下图的对话框后,选择Microsoft VBSscript Regular Expression 5.5,打钩,点OK。

 

最后按Ctrl+S保存文件,注意在保存对话框中,文件类型需要选择“Excel启动宏的工作簿(*.xlsm)”,如下图

Function RangeRegexReplace(ByVal Text As String, ByVal MatchPatternRange As Range, _
    ByVal ReplacePatternRange As Range, Optional ByVal IngoreCase As Boolean = True) As String

'By Jing He 2017-9-1
'Last update 2017-9-2

Dim count As Integer, x As Integer, i As Integer, j As Integer
Dim pattern() As String, replace() As String

If MatchPatternRange.count <> ReplacePatternRange.count Then
    RangeRegexReplace = "Numbers of cells in MatchPatternRange and ReplacePatternRange are not equal."
    Exit Function
End If

count = MatchPatternRange.count
ReDim pattern(0 To count - 1) As String
ReDim replace(0 To count - 1) As String

i = 0
For Each c In MatchPatternRange
    pattern(i) = c.Value
    i = i + 1
Next c

j = 0
For Each c In ReplacePatternRange
    replace(j) = c.Value
    j = j + 1
Next c


'Give no match value
RangeRegexReplace = "-"

Dim regex As New RegExp
With regex
    .Global = True
    .MultiLine = True
    .IgnoreCase = IngoreCase
End With

For x = 0 To count - 1 Step 1
    regex.pattern = pattern(x)
    If regex.Test(Text) Then
        RangeRegexReplace = regex.replace(Text, replace(x))
        Exit For
    End If
Next x

End Function

 

 顺便附带一个使用单个正则表达式进行查找替换的自定义函数,使用这个函数时,正则表达式可以直接写入公式的参数内,不需要放在单元格内再去引用。

Function RegexReplace(ByVal Text As String, ByVal MatchPattern As String, _
  ByVal ReplacePattern As String, Optional ByVal IngoreCase As Boolean = True) As String

'By Jing He 2017-9-1

Dim regex As New RegExp

With regex
    .Global = True
    .MultiLine = True
    .IgnoreCase = IngoreCase
    .pattern = MatchPattern
End With

If regex.Test(Text) Then
    RegexReplace = regex.replace(Text, ReplacePattern)
Else
    RegexReplace = "-"
End If

End Function

 

正则表达

1、正则表达式-简介正则表达式的使用,可以通过简单的办法来实现强大的功能。下面先给出一个简单的示例:^ 为匹配输入字符串的开始位置。[0-9]+匹配多个数字, [0-9] 匹配单个数字,+ 匹配一个或者多个。abc$... 查看详情

正则表达式之原理篇

...用“+” 进行拼接,于是自己写了个function,利用正则表达式来进行匹配。对于正则表达式,之前不了解原理,每次要用的时候查一下,很浪费时间。内容基础知识;正则表达式引擎;贪婪与非贪婪模式;DFA与NFA引擎;回溯机... 查看详情

python中正则表达式的匹配规则总结

...Python的总结文章请访问:https://www.jianshu.com/nb/47435944正则表达式用来匹配字符串,在python中可以使用re模块来完成,本篇做一个对正则表达式的匹配规则的总结在上述的精确匹配后可以跟上一些符号来进行模糊的匹配:可以使用... 查看详情

idea使用正则表达式进行匹配替换

关于正则表达式可以参考相应的笔记另外如果要提取正则表达式中匹配到的内容,使用$1-$...按顺序取(第一个表达式到第N个表达式匹配到的数据), 这点和linux正则获取的方式是一样的 查看详情

如何使用正则表达式的结果进行进一步匹配?

】如何使用正则表达式的结果进行进一步匹配?【英文标题】:Howtouseresultofaregrexforfurthermatching?【发布时间】:2019-04-2405:22:38【问题描述】:假设我有这样的正则表达式[\\d%]+所以对于4500%,它将匹配。现在我希望这个匹配的字符... 查看详情

多次匹配正则表达式模式

】多次匹配正则表达式模式【英文标题】:Matchregexpatternmultipletimes【发布时间】:2020-10-1023:47:59【问题描述】:我正在尝试编写一个匹配给定模式的正则表达式2到无限次。实际上,我只是想将多个换行符合并为一个,如果有的... 查看详情

正则引擎入门——正则文法匹配可以简单快捷(代码片段)

...的较好的文章之一,读者在阅读之前,最好有一定的正则表达式的基础。翻译内容仅代表作者观点。侵删  该作者所有的文章的网址在此:https://swtch.com/~rsc/regexp/正文正则表达式搜索算法  现在我们已经有了确定一个正则表... 查看详情

linux正则表达式

参考技术A一.linux文本查找命令在说linux正规表达式之前,还介绍下linux中查找文本文件常用的三个命令:1.grep:最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。2.egrep:扩展式grep,其使用扩展式正规表达式... 查看详情

jmeter正则表达式获取多个参数实践

...者做一些其它处理。下面的这个例子讲解,如何通过正则表达式的方法获取参数值,首先需要先了解下相关语法,之后在进行实践。下示例中,要求提取【登录】接口的token、userid、username、unixtime等信息,介绍用正则表达式的方... 查看详情

re模块

#经过前面的知识储备,我们可以在Python中使用正则表达式了。Python通过re模块提供对正则表达式的支持。 1、re.match函数#一般使用re的步骤是先将正则表达式的字符串形式编译为Pattem实例,然后使用Pattem实例处理文本并获得匹... 查看详情

正则表达式了解(代码片段)

简单了解一下正则表达式,用到了在查询即可。正则表达式(RegularExpression)是一种文本模式,包括普通字符(例如,a到z之间的字母)和特殊字符(称为"元字符");描述了一种字符串匹配的模式(pattern),可以用来检查... 查看详情

通过正则表达式模式匹配使用 stringbuilder 替换多次出现的字符串

】通过正则表达式模式匹配使用stringbuilder替换多次出现的字符串【英文标题】:Replacingmutipleoccurrencesofstringusingstringbuilderbyregexpatternmatching【发布时间】:2019-11-1218:43:09【问题描述】:我们正在尝试用它们各自的“组”替换字符... 查看详情

使用正则表达式匹配多个逗号分隔的单词

】使用正则表达式匹配多个逗号分隔的单词【英文标题】:Usingregextomatchmultiplecommaseparatedwords【发布时间】:2016-06-1011:20:21【问题描述】:我正在尝试找到合适的正则表达式模式,让我能够挑选出以逗号开头或结尾的整个单词,... 查看详情

第九章使用正则表达式进行搜索

1.regexp:正则表达式 如上输出:like匹配整列,而regexp在列值内进行匹配,如果被匹配的文本在列值中出现,regexp就会找到它2.binary:进行区分大小写的匹配 3.进行or匹配 4.匹配指定的字符通过使用一组[]即可完成特定的字... 查看详情

如何使用正则表达式匹配多个单词

】如何使用正则表达式匹配多个单词【英文标题】:Howtouseregexformatchingmultiplewords【发布时间】:2015-08-2100:53:49【问题描述】:如何使用正则表达式匹配java中的多个单词?比如addAction("word")和intentFilter("word")同时进... 查看详情

使用正则表达式进行搜索

参考技术A正则表达式用来匹配文本的特殊字符集合  不区分大小写这是使用的  .区别like与regexp selectprod_namefromproductswhereprod_namelike'1000'orderbyprod_name;LIKE匹配整个列,如果被匹配字符在列值中出现,LIKE找不... 查看详情

hive正则表达式

...考技术A参考维基百科、HadoopHive概念学习系列之hive的正则表达式初步(六)和Hive正则匹配函数之前没有在意过正则表达式,但是工作组不可避免的遇到了,感觉也比较重要,就花点时间理解一下。正则表达式的目的:对字符串st... 查看详情

使用正则表达式进行字符串比较

】使用正则表达式进行字符串比较【英文标题】:Stringcompareusingregex【发布时间】:2015-10-1710:25:20【问题描述】:我有一个字符串说:std::strings1="@Hello$World@";我想将它与另一个字符串匹配,但只匹配某些字符:std::strings2=&... 查看详情