VBScript 中的 Regex Positive Lookbehind 替代方案

Regex Positive Lookbehind alternative in VBScript

所以,VBScript apparently doesn't support Lookbehind at all.

我正在寻找可以与 VBScript 一起使用的替代有效正则表达式。

仅供参考,我将在 HP UFT 中使用它,所以我别无选择,只能使用 VBScript(如果没有其他最简单的方法,我可能不得不研究其他选项,例如执行 Java (或其他语言)来自 VBS 的代码)。

我想要实现的目标:
从给定的一堆文本中,我想提取某些字母数字字符串。此字符串可能包括 -_.///

我唯一知道的是,这个字符串后面会跟一个特定的词(例如DIA)并且这个字符串后面会有一个space。

这里是我可以用作替代的 VBS 代码片段:
此示例代码仅检索第一个匹配项。如果我找不到其他选择,我可以修改它。

serviceType = "DIA"

tempTxt = obj.GetROProperty("innertext")

If InStr(1, tempTxt, serviceType, 0) > 0 Then
    iStartPoint = InStr(1, tempTxt, serviceType, 0) + Len(serviceType)
End If

tempTxt = LTrim(Mid(tempTxt, iStartPoint))

iStartPoint = InStr(1, tempTxt, " ", 1)

MsgBox Left(tempTxt, iStartPoint)

这是我正在使用的正则表达式:

(?<=DIA\s).*?(?=\s)

这是我尝试过并成功运行的 demo。 我只需要找到 VBScript 替代方案。


更新

这是我在尝试建议的正则表达式后得到的结果:
(return 值看起来不同,因为我使用了不同的输入文本。)

这是我使用的代码:

Call RegExpMultiSearch(tempTxt, "DIA\s+(\S+)")

Public RegMatchArray

Function RegExpMultiSearch(targetString, ptrn)
    'CREATE THE REGULAR EXPRESSION
    Set regEx = New RegExp
    regEx.Pattern = ptrn
    regEx.IgnoreCase = True    'False
    regEx.Global = True

    'PERFORM THE SEARCH
    Set Matches = regEx.Execute(targetString)

    'REPORTING THE MATCHES COLLECTION
    If Matches.Count = 0 Then
        Actual_Res = "NO occurrence of pattern '" & ptrn & "' found in string '" & targetString & "'"
        Print Actual_Res
    Else
        'ITERATE THROUGH THE MATCHES COLLECTION
        For Each Match in Matches
            'ADD TO ARRAY
            ReDim Preserve arrArray(i)
            arrArray(i) = Match.Value
            i = i + 1
        Next
        Actual_Res = UBound(arrArray) - 1 & " occurrence of pattern '" & ptrn & "' found in string '" & targetString & "' successfully"
        Print Actual_Res
        RegMatchArray = arrArray
    End If

    If IsObject(regEx) Then Set regEx = Nothing End If
    If IsObject(Matches) Then Set Matches = Nothing End If
End Function

最后更新

我使用建议的正则表达式得到了想要的结果。另外我不得不使用 SubMatches(0) 而不是 Match.Value.

您可以将正则表达式重新修改为带有 capturing group 的模式,这样您就可以访问所需的值:

DIA\s+(\S+)

参见regex demo

请注意,您甚至不需要前瞻,因为 .*?(?=\s) 匹配除换行符以外的任何 0+ 个字符,尽可能少的直到空格。当然,如果您需要检查空格,只需在模式末尾附加 \s

图案详情

  • DIA - DIA 子字符串(如果需要全字匹配,请在前面加上 \b word boundary
  • \s+ - 1 个或多个空格
  • (\S+) - 第 1 组:除空白字符外的一个或多个字符。

这是一个 VBA 测试:

Sub GetValues()
Dim rExp As Object, allMatches As Object, match As Object
Dim s As String

s = "DIA 8778680044 SVU-RMW ANNISTON SERF1450 COMMERCE BLVD ANNISTONAL DIA DS1IT-15600804-123 SVU-RMW ANNISTON2130 ROBERTS DR ANNISTONAL"

Set rExp = CreateObject("vbscript.regexp")
With rExp
    .Global = True
    .MultiLine = False
    .Pattern = "DIA\s+(\S+)"
End With

Set allMatches = rExp.Execute(s)
For Each match In allMatches
    WScript.Echo match.SubMatches.Item(0)
Next

End Sub

输出:

8778680044
DS1IT-15600804-123