在 VBA(Excel)RegEx 搜索期间排除文本

在 VBA(Excel)RegEx 搜索期间排除文本

我在 Excel 2016 (VBA) 中使用正则表达式的宏中有一个函数,该函数应该从文本中删除所有数字,这样我基本上只剩下字母字符。问题是这些数字不仅仅是数字,它们还可以是罗马数字(仅包括罗马数字一到四,即 I、II、III 和 IV)。例如,请看以下可能的项目列表:

Program Manager 3
Systems Engineer 3
Secretary III 12345
Consultant
IT Instructor 3
Computer Operations Manager 1
User Support Specialist 2
Engineering Tech II 12345
IT Instructor 2
Network Tech 3

我的函数使用以下 VBA 正则表达式代码来替换数字和罗马数字(此时我不担心修剪或任何事情):

Public Function RemoveNumbers(Txt As String) As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        .Pattern = "[0-9]|\s[i]+|\s[iv]$"
        RemoveNumbers = .Replace(Txt, "")
    End With
End Function

总体来说,这没问题,但我遇到了一个问题。我的正则表达式错误地改变了短语信息技术讲师 2并将其变成信息技术讲师(因为空格和单词讲师,以与罗马数字 1 相同)。我尝试在网上寻找答案,并测试了许多变体,以使 RegEx 排除短语讲师在搜索中,但我无法让它工作。我尝试使用的一些模式包括:

        .Pattern = "\b(!Instructor)\b|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "\b(!Instructor)\b\w+|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "(!Instructor\b)|[0-9]|\s[i]+|\s[iv]$"
...etc

而且由于我必须删除罗马数字一(I),所以我不能使用以下方法作为解决方法:

        .Pattern = "[0-9]|\s[i]{2,}|\s[iv]$"

是否可以使用 Excel 2016 VBA 正则表达式将字符串(例如 Instructor)排除在搜索范围之外?如果可以,有人可以告诉我如何在 VBA RegEx 中排除项目的正确方法吗?

谢谢

答案1

我找到了答案。以下语法对我有用(经过多次尝试和错误):

    .Pattern = "\b(?!(?:Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

-- 已编辑并添加以下详细信息 --

我又加了一个词(即,信息) 到 RegEx 排除:

"\b(?!(?:Info|Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

图案细节:

  • \b——设置单词边界
  • (?!(?:Info|Instructor)\b) - 后面的单词有零个或一个 (?) 排除项 (!)。非捕获组,因为我们不需要它们。末尾的 \b 是单词边界
  • (?:[0-9]+|\s[i]+|\s[iv]$) - 匹配一个或多个 0 - 9 数字。匹配空格 (\s) 后跟一个或多个 i 字符。匹配空格后跟 iv ($ 表示在末尾搜索)
  • | = OR(始终使用)
  • \b - 尾随单词边界

-- 已编辑,因为最终这对我来说效果最好 --

        .Pattern = "\b(?:[0-9]+|\s[i]+|\s[iv]+$)\b"

相关内容