我有一个VBA RegEx函数,用于搜索模式为1个字母后跟6个数字的ID。我一直在使用模式[a-zA-Z]{1}\d{6}
来查找ID,但我绝对会遇到特殊情况。
通常,ID由非字符/数字包围,例如" domain \ J123456,上次登录[etc]" 所以我尝试了[^a-zA-Z]{1}[a-zA-Z]{1}\d{6}[^a-zA-Z\d]{1}
-worked。这种模式字符串失败的地方是
另一个令人沮丧的是,VBA对RegEx的实现不太合规,有时使用非标准表达式。我知道我可以进行多次RegEx搜索,但这似乎效率低下。神的任何帮助将不胜感激。
功能 我正在使用MS Access 2007和" Microsoft VBScript正则表达式5.5"库(我的环境被锁定,因此我无法在混合中引入新的/不同的库)。
修改 : 以下是一些模拟的条目,介绍了一些场景。我应该大胆应该匹配什么。每个条目只有1个有效匹配。
编辑 - 解决方案
根据下面接受的答案,这里是需要它的人的工作功能。
Public Function findID(search_str As String)
' Find [letter][6-digit number] ID in string
Dim regEx As New VBScript_RegExp_55.RegExp
Dim matches
findSID = ""
regEx.Pattern = "(?:^|[^a-zA-Z\d])([a-zA-Z]{1}\d{6})(?![a-zA-Z\d])"
regEx.Global = True
If regEx.test(search_str) Then
Set matches = regEx.Execute(search_str)
'-- Some of the matches return the match and left-most border-char. Trim it off
findID = Right(matches(0).Value, 7)
Else
findID = "No match"
End If
End Function
答案 0 :(得分:2)
您使用格式
的正则表达式(?:^|[^a-zA-Z\d])([a-zA-Z]{1}\d{6})(?![a-zA-Z\d])
捕获组1将包含ID
(?![a-zA-Z\d])
断言正则表达式后面没有数字或字母