У меня есть шаблон регулярного выражения, который отлично работает на 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.
(1-я подгруппа), Angela
(вторая подгруппа), Carraway (третья подгруппа), 402 Arlington Drive (четвертая подгруппа), Concord, MA 01742 (пятая подгруппа). В Python он идеально соответствует 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
Это картина результатов. Как видите, первые две подгруппы работают, но затем регулярное выражение (по крайней мере, я так думаю) сталкивается с ошибкой группировки и сбрасывает почти весь остальной контент в следующий столбец. Затем он переходит к четвертому столбцу, где также возникают ошибки. Это проблема с итерацией кода или самим регулярным выражением. Я пытался устранить неполадки в коде и не могу найти причин, по которым он не может правильно разбить текст, кроме ошибки регулярного выражения. Есть предположения?