Ich habe ein Regex-Muster, das perfekt in Python und verschiedenen anderen Sprachen funktioniert, aber nicht die Unterübereinstimmungen für meine Implementierung in einem VBScript regex (die Engine von denen ist scheinbar fast identisch mit JavaScript). Das Muster in Frage lautet wie folgt:Verstehen der Unterschiede in VBScript/Javascript Regex zum Lösen von SubMatch Problem
"Sincerely,[\s\n]+([\w\.]+)\s+(\w+)\s+(.+)[\s\n]+(\d+\s.+)[\s\n]+(.+)"
Ein Beispiel Testfall ist wie folgt:
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
Ziel ist es für eine globale regex, dass Extrakte 5 Untergruppen aus diesem Beispiel Match nach einem variablen Schlüsselwort was hier ist "Mit freundlichen Grüßen". Die Untergruppen sollten Ms.
(1. Untergruppe), Angela
(zweite Untergruppe), Carraway (dritte Untergruppe), 402 Arlington Drive (vierte Untergruppe), Concord, MA 01742 (fünfte Untergruppe) sein. In Python passt es perfekt zu den 5 Gruppen in einem Regex-Tester, aber für VBScript (die JavaScript-Engine) stimmt es mit der gesamten Zeichenfolge überein, aber ohne Untergruppen. Wenn ich also die Unterübereinstimmungen in einem Excel-VBA-Makro anrufe, um in eine Zelle zu schreiben, bekomme ich den gesamten Text in ein Paar Zellen zerlegt. Was mache ich falsch? Gibt es einen Charakter, den ich vermisse, der die Erfassung von Untergruppen deaktiviert? Wenn ja, was ist der entscheidende Unterschied zwischen diesen beiden Engines, damit ich das in Zukunft vermeiden kann und wie könnte man dieses Muster in diesem Testfall beheben? Ich habe versucht, über die Unterschiede online zu lesen, aber alles gesagt scheint nur kleine Unterschiede zu sein, die das Problem verursachen sollte, das ich habe. Jede Hilfe würde sehr geschätzt werden, weil ich den Unterschied/das Problem nicht isolieren kann. Vielen Dank!
Edit: Im Folgenden ist der VBA-Code, der die Regex verwendet:
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
Dies ist ein Bild der Ergebnisse. Wie Sie sehen können, funktionieren die ersten beiden Untergruppen, aber dann läuft die Regex (oder zumindest denke ich) in Gruppierungsfehler und wirft fast den anderen Inhalt in die nächste Spalte. Es bewegt sich dann auf die vierte Spalte und läuft dort auch in Fehler. Ist dies ein Problem beim Iterieren des Codes oder beim Regex selbst? Ich habe versucht, den Code zu beheben, und kann keine Gründe finden, warum er den Text nicht richtig aufbrechen kann, außer dass die Regex fehlerhaft ist. Irgendwelche Gedanken?
Konnten Sie den VBA-Code, den Sie verwenden, den regex ausführen und die submatches abrufen? –
@RichHolton Ich habe Änderungen am ursprünglichen Post vorgenommen, der den Code und weitere Kommentare zusammen mit einem Bild der Ergebnisse zeigt, die ich beim Ausführen der VBA erhalte. Irgendwelche Gedanken? –
Ich vermute, dass Ihr Text etwas anderes als trennt einige der Zeilen, so dass die dritte Gruppe (. *) Zu viel erfasst, was dann den Rest auswirft. Können Sie nachsehen? –