我在 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"