麻烦ID模式之前和之后的内容

时间:2014-12-11 17:27:42

标签: regex vba ms-access-2007 delimiter

我有一个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。这种模式字符串失败的地方是

  • 当ID位于字符串的开头时:" J123456,上次登录[etc]"
  • 当ID位于字符串的末尾时:" domain \ J123456"
  • 当ID是整个字符串时:" J123456"

另一个令人沮丧的是,VBA对RegEx的实现不太合规,有时使用非标准表达式。我知道我可以进行多次RegEx搜索,但这似乎效率低下。神的任何帮助将不胜感激。

功能 我正在使用MS Access 2007和" Microsoft VBScript正则表达式5.5"库(我的环境被锁定,因此我无法在混合中引入新的/不同的库)。

修改 : 以下是一些模拟的条目,介绍了一些场景。我应该大胆应该匹配什么。每个条目只有1个有效匹配。

  • SID =" S-21-121X4440339-682Z003330"姓名="史密斯,约翰"的LoginName =" NAEAST \的 J123456 "
  • J123456 Key = B214440339-1979792683-682E003330
  • L398938943-090934989 J123456
  • J123456

编辑 - 解决方案

根据下面接受的答案,这里是需要它的人的工作功能。

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

1 个答案:

答案 0 :(得分:2)

您使用格式

的正则表达式
(?:^|[^a-zA-Z\d])([a-zA-Z]{1}\d{6})(?![a-zA-Z\d])
  • 捕获组1将包含ID

  • (?![a-zA-Z\d])断言正则表达式后面没有数字或字母

Regex Example