如何在Excel中使用VBA Regex从字符串中提取唯一的5位数字?

时间:2014-06-11 15:40:42

标签: regex excel-vba vba excel

我在Excel中有以下一系列字符串

/item/index/offid/77203/uSasdf/ASFDFAS/catId/401/subCat/709

每个字符串包含由反斜杠分隔的多个数字。然而,这些数字中的一个是唯一的5位数字,并且每个字符串将仅包含一次这样的5位数字标识符。

我希望我的基于VB的宏从每个字符串中提取出5位数字。

我正在寻找的唯一ID可以是5个或6个字符。它始终是字符串中的第一个数字,我知道一旦达到前面的反斜杠,唯一ID就会终止。

1 个答案:

答案 0 :(得分:2)

在大多数正则表达式中,五位数字只是:\d{5}

但也许你可以有几个五位数字,如'/itemindex/12345/12345/77203/', and you want to capture the ones that are guaranteed to be unique, in this case 77203`。

在这种情况下,您需要一个前瞻,如:

^(?=.*(\d{5})(?!.*(\1)))

前瞻断言,后来找不到捕获到第1组的数字(向第1组反向引用(\1)。)

在VBScript中,对于第一个正则表达式,你可以用这个来拉出整体匹配:

Dim myRegExp, FoundMatch
Set myRegExp = New RegExp
myRegExp.Pattern = "\d{5}"
FoundMatch = myRegExp.Test(SubjectString)

对于第二个正则表达式,我们从组1中检索匹配,你需要这样的东西:

Dim myRegExp, Group1, myMatches, myMatch As Match
Dim myRegExp As RegExp
Set myRegExp = New RegExp
myRegExp.Pattern = "^(?=.*(\d{5})(?!.*(\1)))"
Set myMatches = myRegExp.Execute(SubjectString)
If myMatches.Count >= 1 Then
    Set myMatch = myMatches(0)
    If myMatch.SubMatches.Count >= 1 Then
        Group1 = myMatch.SubMatches(1-1)
    Else
        Group1 = ""
    End If
Else
    Group1 = ""
End If