VBA 中所有匹配项的正则表达式数组/列表/集合

标签 regex vba

我正在尝试使用 RegEx 来获取特定字符串对之间存在的不同字符串的所有实例。例如。在以下字符串中:

“开始。你好。杰米。再见。中间。你好。莎拉。再见。结束”

我想通过在 "Hello. ""Hello. " 之间检查来获取由 "Jamie""Sarah" 组成的集合/数组“。再见。”

我的 RegEx 对象工作正常,我觉得我即将成功:

Sub Reggie()
Dim x As String: x = "The Start. Hello. Jamie. Bye. The Middle. Hello. Sarah. Bye. The End"
Dim regEx As RegExp
Set regEx = New RegExp
Dim rPat1 As String: rPat1 = "Hello. "
Dim rPat2 As String: rPat2 = " Bye."
Dim rPat3 As String: rPat3 = ".*"
With regEx
    .Global = True
    .ignorecase = True
    .Pattern = "(^.*" & rPat1 & ")(" & rPat3 & ")(" & rPat2 & ".*)"
    .MultiLine = True
    ' COMMAND HERE
End With
End Sub

但是最后一点COMMAND HERE我正在尝试.replace(x, "$2")它给了我一个匹配的最后一个实例的字符串,即莎拉

我尝试过 .Execute(x) 它给了我一个 MatchCollection 对象,当浏览即时窗口时,我看到该对象仅具有匹配的最后一个实例.

我所要求的是否可能以及如何实现?

最佳答案

这是因为 .* 匹配尽可能多的字符,并且您不应该通过在正则表达式的两端添加 .* 来匹配整个字符串。

此外,您需要转义正则表达式模式中的特殊字符,这里 . 是特殊的,因为它匹配除换行符之外的任何字符。

您需要修复您的正则表达式声明,例如

rPat1 = "Hello\. "
rPat2 = " Bye\."
rPat3 = ".*?"`
.Pattern = rPat1 & "(" & rPat3 & ")" & rPat2

或者,为了进一步增强正则表达式,您可以

  • 将文字空格替换为 \s*(零个或多个空格)或 \s+(一个或多个空格)以支持任何空格
  • 将捕获字符串后的任何非单词字符与 \W+\W* 进行匹配。
rPat1 = "Hello\.\s*"
rPat2 = "\W+Bye\."
rPat3 = ".*?"`
.Pattern = rPat1 & "(" & rPat3 & ")" & rPat2

请参阅regex demo详细信息:

  • Hello\. - Hello. 字符串
  • \s* - 零个或多个空格
  • (.*?) - 第 1 组:除了换行符之外的任何零个或多个字符,尽可能少
  • \W+ - 除 ASCII 字母/数字/_ 之外的一个或多个字符
  • 再见\. - 再见。 字符串。

关于VBA 中所有匹配项的正则表达式数组/列表/集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67532936/

相关文章:

regex - 使用正则表达式匹配两个字符串之间的字符串

excel - 根据单元格值对整行着色

javascript - 如何在 JavaScript 中用 ":"分割字符串,但将各部分保留在引号中?

python-3.x - 正则表达式从文本文件中捕获包含制表符/空格和子字符串的字符串部分

javascript - 我们如何为 ex_date(ddsf#dsd) 编写正则表达式?

vba - 来自Excel vba的POST请求在启用ssl的url上

Excel VBA 抓取亚马逊库存

html - 识别 XMLHTTP 响应中的 NextSibling

excel - IF 在应该返回 TRUE 时返回 FALSE

javascript - javascript中的replaceAll函数不会替换所有出现的地方