不区分大小写的正则表达式 - VBA



>Background:

刚才,我正在回答一个问题,并在VBA内玩弄RegEx。目标是创建字符串中存在的名称列表。RegEx是首选解决方案,因为我们希望防止VBA绊倒标点符号和看起来相似的子字符串,例如:JackJacky


示例数据:

让我举一个简单的例子。想象一下,我们有一个字符串,如下所示:

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名称数组的可能性的同时,让命中不区分大小写的替代方法是什么?

奖金问题:

最终,我想通过分隔符将HitsJoin在一起,例如:

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

没有用于在正则表达式中设置匹配选项的模式修饰符。

最新更新