>Background:
刚才,我正在回答一个问题,并在VBA
内玩弄RegEx
。目标是创建字符串中存在的名称列表。RegEx
是首选解决方案,因为我们希望防止VBA
绊倒标点符号和看起来相似的子字符串,例如:Jack
或Jacky
。
示例数据:
让我举一个简单的例子。想象一下,我们有一个字符串,如下所示:
Dim str As String: str = "Jack's turn, Becky's or Frank?"
我们想知道字符串中提到了某个数组中的哪些名称,例如:
Dim arr As Variant: arr = Array("Jack", "Frank")
示例代码:
为了防止对数组进行迭代,我使用了以下代码:
Sub Test()
Dim str As String: str = "Jack's turn, Becky's or Frank?"
Dim arr As Variant: arr = Array("Jack", "Frank", "Beth")
Dim regex As Object: Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = "b(" & Join(arr, "|") & ")b"
regex.Global = True
Set hits = regex.Execute(str)
For Each hit In hits
Debug.Print hit
Next hit
End Sub
问题:
虽然上面的内容会整齐地返回两个命中,但它不会不区分大小写。例如,更改以下行将仅返回Jack
:
Dim str As String: str = "Jack's turn, Becky's or frank?"
我想我可以通过使用(?i)
关闭区分大小写来解决这个问题:
regex.Pattern = "(?i)b(" & Join(arr, "|") & ")b"
但问题是这对大多数语言都非常有效(在这里测试(,但是VBA
似乎有问题并在执行时生成Error 5017
。
问题:
有人知道为什么吗?这在VBA
中不受支持还是我的语法错误?如果不支持,那么在保留Join
名称数组的可能性的同时,让命中不区分大小写的替代方法是什么?
奖金问题:
最终,我想通过分隔符将Hits
Join
在一起,例如:
Debug.Print Join(regex.Execute(str),", ")
但是,我意识到执行会返回一个集合,并且首先需要迭代,我想避免这种情况。
在 RegExp 对象上设置属性,即
regex.ignorecase = True
正则表达式对象
RegExp 对象有三个属性,它们会影响规则程度 应用表达式:
忽略案例:我相信这是不言自明
的全局:确定 是否在输入字符串中查找所有可能的匹配项。如果 全局设置为 false,仅找到第一个匹配项或 替换(如果适用(。
多行:确定匹配项是否可以 跨换行符。
另请参阅:https://learn.microsoft.com/en-us/previous-versions//1400241x%28v%3dvs.85%29
从 https://www.regular-expressions.info/vbscript.html 关于 VBScript 的正则表达式支持,因为我们正在使用 VBScript 正则表达式 5.5 Microsoft
没有用于在正则表达式中设置匹配选项的模式修饰符。