VBA多级正则表达式或改进的模式?

时间:2012-10-01 06:41:52

标签: regex vba

我在VB中处理正则表达式时遇到问题。我的文字是:

  遗憾的是目前在多伦多主站未定,

我在Expresso中测试了我的正则表达式,并为我的目的找到了这个正则表达式。事情是:多伦多主站也可以只是“多伦多”。所以这是我的模式:

is sadly currently in (([A-Za-z]*)(\s|-)){1,3}(.|\s)*?undetermined

问题是在VB中处理正则表达式,因为我的Pattern给了我这样的结果:

  • 可悲的是目前在多伦多主站未定
    • 未确定
      • 多伦多
      • 主要
      • 未确定
    • 未确定
      • 多伦多
      • 主要
      • 未确定 ....

但我无法通过VB访问多伦多和主要词 - 我也不希望'未确定'成为结果的一部分。我试过match.item(0).submatches.item(0).submatches.item(0)但是如果我尝试match.item(0).submatches.item(0).submatches并且声明没有这样的对象,VBA已经抛出错误 - 显然它不能处理那些“多级”正则表达式。有没有办法改进我的模式,以便我只需要使用一个子匹配,或者是否可以通过VBA使用多个子匹配?!

编辑:

GetDelay.Pattern = is sadly currently in (([A-Za-z]*)(\s|-)){1,3}(.|\s)*?undetermined"
GetDelay.IgnoreCase = True
GetDelay.Multiline = True
...
If GetDelay.TEst(MailBody) Then
        Set m = GetDelay.Execute(MailBody)
        If m.Item(0).SubMatches.Count > 0 Then
            OrtBody = m.Item(0).SubMatches.Item(0).SubMatches.Item(0) + " " + m.Item(0).SubMatches.Item(0).SubMatches.Item(1)  'Error 424 comes here - Object required
            If GetReason.TEst(AbweichungsmailBody) Then
                Set m = GetReason.Execute(AbweichungsmailBody)
                If m.Item(0).SubMatches.Count > 0 Then
                    Reason= m.Item(0).SubMatches.Item(0)
                Else
                    Reason= "Error!"
                End If
            Else
                Reason = "Keine Angabe gefunden!"
            End If
        Else
            thisfunction= False
        End If
    Else
        thisfunction= False
    End If

1 个答案:

答案 0 :(得分:1)

从重复的子表达式(在您的情况下为(([A-Za-z]*)(\s|-)){1,3})捕获结果在任何语言中都会变得棘手。我建议以下作为一种更简单的方法:

1)将您感兴趣的整个部分与简单的正则表达式匹配:

GetDelay.Pattern = "is sadly currently in (.*?) undetermined"

2)一旦你匹配了感兴趣的部分,进行进一步的分析,以获得你想要的。您可以在此步骤中使用另一个RegEx,但我认为您可以Split()使用空格作为分隔符。