Ich habe einige begrenzte Erfahrung mit grundlegenden JavaScript-Regex, die ich zum Bearbeiten einiger Benutzerdateneinträge verwendet habe. Aber jetzt wurde ich nach der Bearbeitung von MS Word 2010-Dokumenten gefragt.
Genauer gesagt erhalten meine Benutzer eine lange numerische Liste mit Daten wie etwa:
1. blah blah 'car' blah blah
2. blah blah 'truck' blah blah
3. blah blah 'boat' blah blah
Dies ist ein unformatiertes, einfaches Word-Dokument. Sie möchten nach jeder Ziffer eine formatierte Kopfzeile, basierend auf dem Element in einfachen Anführungszeichen, wie:
1. CAR: blah blah 'car' blah blah
2. TRUCK: blah blah 'truck' blah blah
3. BOAT: blah blah 'boat' blah blah
Sie haben derzeit Transkriptionisten, die diese Änderungen manuell vornehmen (manchmal mit Fehlern). Mit JavaScript/jQuery könnte ich Code schreiben, um diese Daten zu übernehmen, nach Wörtern in Anführungszeichen zu suchen, die nächste Zahl vor der Übereinstimmung zu finden und nach dem Punkt eine Version in Großbuchstaben einzufügen.
Ich habe jedoch nicht viel Erfahrung mit ähnlichen Funktionen in Word. Kann dies über ein Makro oder eine Art Skript erfolgen? Ist es möglich, meinen JavaScript-/jQuery-Code zu schreiben und ihn irgendwie in einer Word-Instanz auszuführen?
Danke für die Anleitung!
Antwort1
Ja! Microsoft Office VBA unterstützt die Suche nach regulären Ausdrücken nativ. Sie müssen "Microsoft VBScript Regular Expressions 5.5" als Referenz im VBA-Editor für jede .docm
, .xlsm
, usw. Datei hinzufügen, in die Sie Regex-Code einfügen möchten:
Der Großteil des Objektmodells für dieses Regex-Modul ist auf MSDN zu finden.Hier. Was anscheinend fehlt, ist die MultiLine
Einstellung.
Sie verwenden es wie folgt:
- Instanziieren Sie ein neues Regex-Objekt mit
Dim rx as New RegExp
- Setzen Sie die Flags
rx.Global
,rx.MultiLine
, undrx.IgnoreCase
nach Wunsch - Definieren Sie das Muster, indem Sie die entsprechende Musterzeichenfolge zuweisen
rx.Pattern
- Wenn Sie wissen möchten, ob etwas mit dem regulären Ausdruck übereinstimmt, verwenden Sie
rx.Test(str)
, das entsprechendTrue
oder zurückgibt.False
- Der Aufruf
rx.Execute(str)
gibt einMatchCollection
Objekt zurück, das sich wie ein nullbasiertes, eindimensionales Array von null oder mehrMatch
Objekten verhält Match
-Objekte legen die EigenschaftenFirstIndex
,Length
,Value
und offenSubMatches
.FirstIndex
ist der nullbasierte Index des ersten Zeichens der Position, anstr
der die Übereinstimmung gefunden wurdeLength
ist die Länge des übereinstimmenden Teils vonstr
Value
ist das übereinstimmende String-ErgebnisSubMatches
ist ein nullbasiertes Array derUntergeordnete Gruppenim Gesamtspiel- Leider unterstützt Office VBA Regex keine benannten Gruppen wie z. B. Python, daher kann es einige Versuche erfordern, den Gruppenindex mit dem Teil des Musters abzugleichen, an dem Sie interessiert sind
Ich glaube nicht, dass es eine Möglichkeit gibt, eine sed
-artige Ersetzungsoperation an Ort und Stelle durchzuführen – es handelt sich um eine reine Suchfunktion. Es ist jedoch recht einfach, das umgebende VBA zu verwenden, um die Ergebnisse nach Wunsch zu manipulieren.
Antwort2
Wenn das Word-Dokument nur Klartext enthält und nicht sehr groß ist und Sie mit jQuery vertraut sind, können Sie eine einfache Site erstellen, in die das Word-Dokument kopiert/eingefügt werden kann. Sie nehmen die erforderlichen Änderungen vor und lassen das transformierte Word-Dokument herunterladen oder den gewünschten Text ausgeben. Ob dies eine gute Lösung ist, hängt wirklich von weiteren Einzelheiten Ihrer Situation ab.
Das Makro ließe sich wahrscheinlich auch erstellen, aber es könnte, abhängig von der Anzahl Ihrer Benutzer, schwierig sein, es den Benutzern bereitzustellen.
Antwort3
Falls Sie sich mit VBA- oder Python-Skripten nicht auskennen und die Antwortidee von @hBy2Py nicht Ihren Kompetenzen entspricht, versuchen Sie es mit einem Workaround, bei dem Sie Ihren Algorithmus in GoogleSheets/Excel implementieren:
- Upload = Importieren Sie ein unformatiertes, einfaches Word-TXT-Dokument in G'Sheet. Nehmen wir an, Ihre Liste befindet sich in Spalte A.
- Schreiben Sie in Spalte B eine verschachtelte Formel für alle Spalten, indem Sie REGEXEXTRACT für das Wort in Anführungszeichen verwenden und dieses Wort in Großbuchstaben schreiben
=ARRAYFORMULA(UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)")))
- ... oder erstellen Sie eine separate Spalte C und schreiben Sie das Wort groß:
=UPPER(B:B)
- in Spalte C (oder D) neue Liste mit Großbuchstaben zusammenfassen (es gibt mehrere Möglichkeiten, dies zu tun, zum Beispiel durch Aufteilen/Verketten oder einfach
=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&B:B&": "))
Kurz zusammengefasst:
=ARRAYFORMULA(REGEXREPLACE(A:A;"\.(\s)";". "&UPPER(REGEXEXTRACT(A:A;"\'([a-z]+)"))&": "))
Als andere Problemumgehung könnte die hier beschriebene Lösung verwendet werden:Suchen und Ersetzen in Notepad++ mithilfe von Platzhaltern/regulären Ausdrücken