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

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

使用前需要做Early Binding。即在VBE编辑器中,选择菜单栏中的Tool — Reference,如图:

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

此UDF的使用方法为:

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

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

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

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

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

Dim i As Integer, j As Integer, x As Integer
Dim pattern() As String, replace() As String
ReDim pattern(0 To MatchPatternRange.count - 1) As String
ReDim replace(0 To ReplacePatternRange.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

If i <> j Then
    RangeRegexReplace = "Numbers of cells in MatchPatternRange and ReplacePatternRange are not equal."
End If

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

RangeRegexReplace = "-"

For x = 0 To i - 1 Step 1
    regex.pattern = pattern(x)
    If regex.Test(Text) Then
        RangeRegexReplace = regex.replace(Text, replace(x))
    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
时间: 2024-10-12 22:06:08

一个可以使用多个正则表达式进行多次尝试匹配,并进行替换的Excel VBA自定义函数(UFD)的相关文章

第八周 用INDEXOF统计一个字符出现次数&amp;&amp;正则表达式

一.次数统计 <script type="text/javascript">/*计算子字符串在字符中出现的次数*///字符串var str1 = 'zhulinjia zh lia tjqig qgx gja xx yy xxf xxxq wqja ix';//子串var str2 = 'a';alert( Tongji(str1 , str2) );//统计function Tongji(string , char){var index = 0 , index1 = 0

正则表达式入门(六)匹配unicode和其他字符

匹配unicode字符有时候我们需要匹配ASCII范围之外的字符. "Qu'est-ce que la tolérance? c'est l'apanage de l'humanité. Nous sommes tous pétris de faiblesses et d'erreurs; pardonnons-nous réciproquement nos sottises, c'est la première loi de la nature." -Voltaire (1694–1

正则表达式(四)——位置匹配(环视、单词分界符、锚点)

这次的内容是有关于正则表达式中的位置匹配,它包含的内容有两部分,一部分是较为简单的锚点和单词分界符,一部分是较为复杂的零宽断言.复杂有复杂的好处,写起来复杂,能匹配的位置也就越复杂.零宽断言又可以叫做环视.这一部分是重点内容. 锚点 标准的锚点有这么几个,它们是^,$.在普遍的,不涉及任何模式的情况下,脱字符(^)匹配的是文本的起始位置.而$匹配的则是文本末尾的换行符\n之前的位置.举个例子 正则表达式:s$ 上面这个正则表达式的意思就是匹配以字符[s]结尾的行,即[······s/n]这样的字

正则表达式里字符串”不包含”匹配技巧

经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含'h','e','d'三个但字符.那什么样的正则表达式能过滤出不包含完整"hello"字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确.就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问

正则表达式(一)-字符匹配攻略

正则表达式是匹配模式,要么匹配字符,要么匹配位置. 然而关于正则如何匹配字符的学习,比较杂乱,元字符太多,看起来没有系统性,不好记. 现整理如下: 两种模糊匹配 字符组 量词 分支结构 案例分析 1.两种模糊匹配 1.1 横向模糊匹配 定义:横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的. 表示:{m,n},表示连续出现最少m次,最多n次. 例子:比如正则 /ab{2,5}c/ 表示匹配这样一个字符串:第一个字符是 "a",接下来是 2 到 5 个字符 &qu

Java 正则表达式 向前、向后匹配

//向后匹配 String a = "I paid $90 for 10 oranges, 12 pears and 8 apples. I saved $5 on "; Pattern p = Pattern.compile("(?<=\\$)\\d+"); Matcher m = p.matcher(a); while (m.find ()) { String group = m.group (); System.out.println (group);

Excel VBA 从一个工作簿查找另一个一个工作簿中的一些内容复制到另外一个工作簿

帮朋友来写个Excel VBA 以前写过ASP,所以对vb略微熟悉,但VBA 没有仔细研究过. 以前只研究过 vba 写一个 计算个人所得税的程序. 这次写的功能也算是简单,但也耗费了两天的功夫. 需求: 1 从[操作]表中,查找最后一行的数据,每一列 都为关键字 2 遍历这些关键字,从[总表]中查询这个关键字,把这一行后面的内容复制到 [预算]表中去 3 把[操作]中制定内容复制到[信息统计]中 Function Get操作NullLine() ' '从 操作表 获取最后一个有数据下面的空行

发布一个计算桩号之差的Excel自定义函数(VBA)

这是一个可以计算桩号之差(也就是得到长度)的Excel(或WPS)扩展函数,可以减少工程师在统计工程量时的工作量. 该函数具有一定的通用性.可以在MS Office和金山WPS上使用. 文末会给出使用本函数的简单步骤,关于如何在Excel(或WPS)中自定义函数的较详细介绍请移步这里[1]. 将下面内容复制到模块中去,保存后即可使用自定义的ZH_Len函数计算两个桩号之间的长度. '函数:ZH_Len '作用:起终点桩号之差(返回数字) '作者:@我只是一小小鸟 [email protected

Excel公式与函数——每天学一个

说明(2018-5-29 20:35:53): 1. 根据刘伟的视频讲解进行总结,网上讲Excel公式与函数的貌似就他讲的还不错.在他的微博里看到现在的照片胖了不少,不过还挺帅的,不再是以前那个小屌丝了. 2. 一共53个视频,去掉一个开头,去掉一个结尾,还剩51个,一天看一个,俩月就能看完,美滋滋~ 3. 其实我已经看了好几个了,而且因为一个很短,所以一天能看好几个,只能看几个总结几个了. 开始! (1)TRUE与FALSE 公式:=A1=B1 效果:如果A1=B1,显示TRUE,否则显示FA