Platzhaltersuche in Word 2010 - Text im Format ABC.DEF.XYZ suchen

Platzhaltersuche in Word 2010 - Text im Format ABC.DEF.XYZ suchen

Ich versuche, in Word 2010 Text im folgenden Format zu finden: ABC.DEF.XYZ. Dabei geht es im Wesentlichen darum, Codeverweise mit Java-Syntax zu finden, die in das Word-Dokument geschrieben wurden. Bitte beachten Sie, dass ein Verweis mit 3 Elementen nur ein Beispiel ist. Die tatsächlichen Verweise haben mindestens 2 und höchstens 5 Elemente.

Ich habe zahlreiche Wildcard- (und Nicht-Wildcard-)Kombinationen ausprobiert, um dies zum Laufen zu bringen, aber ohne Erfolg. Hier sind einige der Dinge, die ich versucht habe:

  1. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    HINWEIS: Dies funktioniert tatsächlich, um eine 2-Element-Referenz zu finden. Beim Finden des Musters innerhalb einer größeren Zeichenfolge (z. B. beim Abgleichen der Elemente 2 und 3 einer 3-Element-Referenz) war dies ein Glücksspiel.

  2. <([a-z0-9A-Z]@)>(.<([a-z0-9A-Z]@)>)@
    Gibt einen Fehler aus - ungültiges Muster

  3. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    Die Ausführung dauert so lange, dass Word über 15 Minuten hängen blieb und keine einzige Übereinstimmung fand (das Dokument umfasst etwa 150 Seiten Text, also war es vielleicht einfach zu viel für das Dokument)

  4. <([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>.<([a-z0-9A-Z]@)>
    Als ich dies ausprobiert habe, stürzte Word tatsächlich ab.

Idealerweise wäre meiner Meinung nach eine funktionierende Version von Nr. 2 ideal – ich weiß jedoch nicht, wie ich das Muster gültig machen kann.

Wenn dies nicht möglich ist, könnte ich einfach Nr. 1 verwenden und hoffen, dass es alles erfasst (ich bin nicht sicher, warum es mit bestimmten Zeichenfolgen übereinstimmt und mit anderen nicht).

Jede Hilfe wird sehr geschätzt.

Antwort1

Sie können die VBA-RegEx-Engine von Word anstelle der Platzhaltersuche von Word verwenden.


Ok, die Aufgabe bestand darin, alle Zeichenfolgen mit dem folgenden Muster zu finden

###.###  
###.###.###
###.###.###.###
###.###.###.###.###

Das beste Muster, das ich erstellen konnte, war

([\w\d]{3}\.){1,4}[\w\d]{3}

Das Ergebnis sind die gelb markierten Treffer

Bildbeschreibung hier eingeben

Mustererklärung

  • \wentspricht einem einzelnen Zeichen aus Az. Groß- und Kleinschreibung werden nicht berücksichtigt.
  • \dentspricht einer Ziffer 0-9
  • [\w\d]{3}passt zu 3 Zeichen oder Ziffern wie ABC, abc, 123, Ab1- aber nicht A$Czu oderABCD
  • ([\w\d]{3}\.){1,4}passt zu 1,2,3 oder 4 Gruppen mit einem Folgepunkt \.. Die letzte Gruppe [\w\d]{3}verlangt keinen Folgepunkt

VBA-Makro

Drücken Sie ALT+, F11um den VBA-Editor zu öffnen. Fügen Sie den Code an einer beliebigen Stelle ein und führen Sie ihn mitF5

Sub RegExMark()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")

    RegEx.Global = True
    RegEx.Pattern = "([\w\d]{3}\.){1,4}[\w\d]{3}"

    Set Matches = RegEx.Execute(ActiveDocument.Range)
    For Each hit In Matches
       Debug.Print hit
       ActiveDocument.Range(hit.FirstIndex, hit.FirstIndex + hit.Length). _
         HighlightColorIndex = wdYellow
    Next hit

End Sub

Vorbehalt

Wie im Beispielbild rot markiert, hat das aktuelle Muster einen Fehler und passt auch zu Teilstrings von Strings, die zu lang sind. Ich habe ein bisschen damit herumgespielt \b, [^\.]aber \snichts davon hat in jedem Fall funktioniert. Vielleicht finden andere Benutzer eine gültige Lösung?

Verwendete Ressourcen

Antwort2

Ich würde vorschlagen, den Text in Notepad++ zu kopieren und dann die Änderungen mit der RegEx-Option vorzunehmen.

Ich weiß, das klingt mühsam, aber wenn Sie sich erst einmal daran gewöhnt haben, können Sie sehr schnell zwischen den Programmen wechseln.

Der reguläre Ausdruck ist eine Option im Suchen/Ersetzen-Fenster in Notepad++. Andere Editoren haben dieselbe Funktion.

Stefan

Antwort3

Wenn Sie die Suchmethode des Bereichsobjekts in Word wirklich verwenden müssen, müssen Sie den Text meiner Ansicht nach mehrmals durchgehen und dabei jedes Mal eines der folgenden Suchplatzhalter verwenden:

  1. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  2. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  3. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  4. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  5. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@) [!.a-z0-9A-Z]

  6. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

  7. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[!.a-z0-9A-Z]

  8. [!.a-z0-9A-Z]([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@).([a-z0-9A-Z]@)[.][!a-z0-9A-Z]

Die erste Zeile jeder Gruppe findet eine Versnummer, auf die kein Punkt oder ein Alphanum folgt. Die zweite Zeile findet eine Versnummer, die mit einem Punkt endet, wie z. B. ein Satzende.

Diese Platzhalter finden eine Auswahl beginnend mit dem Zeichen vor der Versionsnummer bis zu den 2 Zeichen nach der Versionsnummer. Die Untergruppen werden jedoch extrahiert und korrekt zugewiesen.

Es gibt hier zwei Probleme bei der Verwendung der Find-Methode von Word mit Platzhaltern. Eins ist, dass Word keine Möglichkeit hat, 0 oder mehr eines bestimmten Zeichens oder einer Gruppe desselben anzugeben. Dadurch werden einige einfache Methoden zum Abgleichen eliminiert, die von der Regex-Funktion behandelt werden können.

Das zweite Problem besteht darin, dass ein Punkt innerhalb der Versionsnummer wie das Wortende aussieht. Die spitzen Klammern sind also redundant zur Verwendung des Punkts im Platzhalter. Spitze Klammern sollten auch nicht extern verwendet werden, da dies zu einer falschen Übereinstimmung führt, wenn eine Versionsnummer mit einer kleinen Anzahl von Untergruppen innerhalb einer Zeichenfolge mit einer größeren Anzahl von Untergruppen gefunden wird.

Ich muss auch hinzufügen, dass Sie, wenn Sie „Suchen“ und dann „Ersetzen“ ausführen, die von der Ausführung von „Suchen“ zurückgegebene Auswahl so ändern sollten, dass ihr Ende dem Ende des Dokuments entspricht (hoffentlich haben Sie diesen Wert zuvor gespeichert). Dies liegt daran, dass der Ersetzungsbefehl die passende Auswahl nicht erneut findet, wenn die Auswahl dem „Suchen“-Text entspricht. Ich weiß, dass dies für Suchen/Ersetzen ohne Platzhalter zutrifft. Vorsicht ist besser als Nachsicht.

verwandte Informationen