VBA中的正则表达式中有"回顾前瞻"吗?

16
有没有办法在VBA正则表达式中进行负向和正向后顾?
我想要的是,如果字符串以"A"开头,就不匹配。目前我是在模式的开头使用^A,然后去掉匹配(0)的第一个字符。显然这不是最好的方法!
我正在使用regExp对象。

我假设你正在使用RegExp对象? - Robert Harvey
2个回答

17

VBA提供了前瞻(正和负)的功能,但它不太一致地没有后顾功能

在我看过的使用Regex与VBA最好的示例是Patrick Matthews的这篇文章

[使用Execute更新示例而不是Replace]

虽然我对你的用法不完全清楚,但你可以使用以下函数:

  • 跳过任何以aA开头的单词(大小写不敏感)。
  • 对于所有不以a / A开头的单词,它从第二个字符开始返回所有内容。 这是通过使用子匹配实现的(()内的模式是第一个子匹配)。

要理解完整的模式,您可以参考regex101上的解释

    Sub TestString()
       MsgBox ReducedText("cfat dcat")
       ' results in:        fat  cat
       MsgBox ReducedText("Sat all over the hat again")
       ' results in:        at      ver  he  at
    End Sub

    Function ReducedText(strIn As String) As String
       Dim objRegex As Object
       Dim objRegMC As Object
       Dim objRegM As Object
       Dim strOut As String
       Set objRegex = CreateObject("vbscript.regexp")
       With objRegex
          .IgnoreCase = True
          'not needed if matching the whole string
          .Global = True
          .Pattern = "\b[^a\s]([a-z]+)"
          If .test(strIn) Then
             Set objRegMC = .Execute(strIn)
             For Each objRegM In objRegMC
                strOut = strOut & objRegM.submatches(0) & vbNewLine
             Next
             ReducedText = strOut
          Else
             ReducedText = "Starts with A"
          End If
       End With
    End Function

-2

把 ^A 放在一个非捕获组中,并使用匹配对象的 SubMatches 属性来获取您的匹配值,这个想法怎么样?


1
那听起来很有趣。如何使用子匹配? - Rich Tier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接