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

Jvd*_*vdV 5 regex arrays excel vba

背景:

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


样本数据:

让我举一个简单的例子。想象一下我们有一个像这样的字符串:

Dim str As String: str = "Jack's turn, Becky's or Frank?"
Run Code Online (Sandbox Code Playgroud)

我们想知道字符串中提到了某个数组中的哪些名称,例如:

Dim arr As Variant: arr = Array("Jack", "Frank")
Run Code Online (Sandbox Code Playgroud)

示例代码:

为了防止对数组进行迭代,我使用了以下代码:

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
Run Code Online (Sandbox Code Playgroud)

问题:

虽然上面会整齐地返回两个命中,但它不区分大小写。例如,更改以下行只会返回Jack

Dim str As String: str = "Jack's turn, Becky's or frank?"
Run Code Online (Sandbox Code Playgroud)

我想我可以通过使用(?i)以下方法关闭区分大小写来解决这个问题:

regex.Pattern = "(?i)\b(" & Join(arr, "|") & ")\b"
Run Code Online (Sandbox Code Playgroud)

但问题是这对于大多数语言(这里是 test)来说都是完美的,但是它VBA似乎有问题并Error 5017在执行时生成一个。


题:

有人知道为什么吗?这是不支持VBA还是我的语法错误?如果不支持,在保留Join名称数组的可能性的同时,有什么替代方法可以让点击不区分大小写?

奖金问题:

最终我想通过分隔符JoinHits它们放在一起,例如:

Debug.Print Join(regex.Execute(str),", ")
Run Code Online (Sandbox Code Playgroud)

但是,我意识到执行会返回一个集合并首先需要迭代,这是我想避免的。

QHa*_*arr 10

在 RegExp 对象上设置属性,即

regex.ignorecase = True
Run Code Online (Sandbox Code Playgroud)

正则表达式对象

RegExp 对象具有三个影响正则表达式应用方式的属性:

IgnoreCase:我相信这是不言自明的

全局:确定是否在输入字符串中查找所有可能的匹配项。如果 Global 设置为 false,则仅会找到或替换第一个匹配项(如适用)。

MultiLine:确定匹配是否可以跨越换行符。

另请参阅:https : //docs.microsoft.com/en-us/previous-versions//1400241x%28v%3dvs.85%29

来自https://www.regular-expressions.info/vbscript.html关于 VBScript 的正则表达式支持,因为我们使用的是 Microsoft VBScript 正则表达式 5.5

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