VBA中的条件正则表达式

时间:2015-06-23 21:30:56

标签: regex excel vba excel-vba

我在Excel VBA中使用RegEx解析多个HTML文件(我不知道最好的事情),但我有这个案例,可以是 - 场景1:

<span class="big vc vc_2 "><strong><i class="icon icon-angle-circled-down text-danger"></i>&pound;51,038</strong> <span class="small">(-2.12%)</span></span>

或可能 - 场景2:

<span class="big vc vc_2 "><strong><i class="icon icon-angle-circled-up text-success"></i>&pound;292,539</strong> <span class="small">(14.13%)</span></span>

如果课程以danger结尾,我想返回-51038-2.12% 如果课程以success结尾,我想返回+29253914.13%

我一直用于第二种情况的代码并且运行正常:

Sub Test()
    With CreateObject("VBScript.RegExp")
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = "<i class=""icon icon-angle-circled-up text-success""></i>([\s\S]*?)<"
        sValue = HtmlSpecialCharsDecode(.Execute(sContent).Item(0).SubMatches(0))
    End With

sValue = CleanString(sValue)
End sub

Function HtmlSpecialCharsDecode(sText)
    With CreateObject("htmlfile")
        .Open
        With .createElement("textarea")
            .innerHTML = sText
            HtmlSpecialCharsDecode = .Value
        End With
    End With
End Function

Function CleanString(strIn As String) As String
    Dim objRegex
    Set objRegex = CreateObject("vbscript.regexp")
    With objRegex
     .Global = True
     .Pattern = "[^\d]+"
    CleanString = .Replace(strIn, vbNullString)
    End With
End Function

1 个答案:

答案 0 :(得分:0)

您需要做的就是添加一些带有“或”条件的捕获组。在您的情况下,您需要组(success|danger)(根据示例也是(up|down))。然后,不要只检查 子匹配,而是检查您在模式中添加的条件:

Dim regex As Object
Dim matches As Object
Dim expr As String

expr = "<i class=""icon icon-angle-circled-(up|down) text-(success|danger)""></i>(.*?)</.*\((.*)%\)<.*"

Set regex = CreateObject("VBScript.RegExp")
With regex
    .Global = True
    .MultiLine = True
    .IgnoreCase = False
    .Pattern = expr
    Set matches = .Execute(sContent)
End With

Dim isDanger As Boolean

If matches.Count > 0 Then
    isDanger = (HtmlSpecialCharsDecode(matches.item(0).SubMatches(1)) = "danger")
    sValue1 = HtmlSpecialCharsDecode(matches.item(0).SubMatches(2))
    sValue2 = HtmlSpecialCharsDecode(matches.item(0).SubMatches(3))
End If

If isDanger Then
    'Was "danger"
    Debug.Print -CLng(CleanString(sValue1))
    Debug.Print -CDbl(sValue2)
Else
    'Was "success"
    Debug.Print CLng(CleanString(sValue1))
    Debug.Print CDbl(sValue2)
End If