了解VBScript / Javascript正则表达式中的差异以解决子匹配问题

时间:2017-05-07 15:54:16

标签: javascript regex vba vbscript regex-group

我有一个在Python和其他各种语言中完美运行的正则表达式模式,但是无法捕获我在VBScript正则表达式中实现所需的子匹配(其引擎显然几乎与JavaScript相同)。有问题的模式如下:

"Sincerely,[\s\n]+([\w\.]+)\s+(\w+)\s+(.+)[\s\n]+(\d+\s.+)[\s\n]+(.+)"

示例测试用例如下:

email received 3/30/17:

Dear Sir,

Hello

Sincerely,

Mr. Robert Thomas
1104 Madison Avenue
New York, NY 10021


email received 3/30/17:

Dear Sir,

Hello

Sincerely,

Ms. Angela Carraway
402 Arlington Drive
Concord, MA 01742

目标是一个全局正则表达式,它在一个变量关键字之后从这个示例匹配中提取出5个子组,这里是"此致,"。子组应为Ms.(第一子组),Angela(第二子组),Carraway(第三子组),402 Arlington Drive(第四子组),Concord,MA 01742(第五子组)。在Python中,它在Regex测试器中完美匹配5组,但对于VBScript(JavaScript引擎),它匹配整个字符串作为匹配,但根本没有子组。因此,当我在Excel VBA宏中调用子匹配来写入单元格时,我将所有文本混淆成几个单元格。我究竟做错了什么?我缺少一些禁用捕获子组的字符吗?如果是这样,这两个引擎之间的关键区别是什么,以便我将来可以避免这种情况,如何在这个测试用例中修复这种模式?我曾尝试在网上阅读有关差异的信息,但所说的一切似乎只是导致我遇到问题的小差异。任何帮助将不胜感激,因为我似乎无法隔离差异/问题。谢谢!

编辑: 以下是使用正则表达式的VBA代码:

Sub regex()
    Dim docxinput As String
    Dim keyword As Variant
    Dim patterninput As Variant
    Dim pattern As String
    Dim regex As New RegExp

    docxinput = Application.GetOpenFilename(Title:="Step #1: Enter Word Document Input File Name")
        Dim wrdApp As Word.Application
        Dim wrdDoc As Word.Document
        Dim strInput As String

        Set wrdApp = CreateObject("Word.Application")
        wrdApp.Visible = False

        Set wrdDoc = wrdApp.Documents.Open(docxinput)
        strInput = wrdDoc.Range.Text

        Debug.Print (strInput)
        wrdDoc.Close 0
        Set wrdDoc = Nothing
        wrdApp.Quit
        Set wrdApp = Nothing

    pattern = "Sincerely,[\s\n]+([\w\.]+)\s+(\w+)\s+(.+)[\s\n]+(\d+\s.+)[\s\n]+(.+)"

    Dim objMatches As MatchCollection

    With regex
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .pattern = pattern
    End With

    Set objMatches = regex.Execute(strInput)
    Dim row As Variant

    Dim SubMatches As Variant
    row = 2
    For Each SubMatches In objMatches
        Cells(row, 1).Value = objMatches(0).SubMatches(0)
        Cells(row, 2).Value = objMatches(0).SubMatches(1)
        Cells(row, 3).Value = objMatches(0).SubMatches(2)
        Cells(row, 4).Value = objMatches(0).SubMatches(3)
        Cells(row, 5).Value = objMatches(0).SubMatches(4)
        row = row + 1
    Next
End Sub

这是结果的图片。正如您所看到的,前两个子组可以工作,但是正则表达式(或者至少我认为)会遇到分组错误并将几乎其他内容转储到下一列。然后它移动到第四列,也在那里遇到错误。这是代码迭代或正则表达式本身的问题。我试图对代码进行故障排除,并且无法找到除了正则表达式错误之外无法正确破坏文本的原因。有什么想法吗?

图片:Screenshot of VBA Regex Issue

0 个答案:

没有答案