Regex-Wort-Makro, das zwei Wörter in einem Bereich voneinander findet und diese Wörter dann kursiv schreibt?

Ich verstehe gerade erst die regulären Ausdrücke und habe die Lernkurve als ziemlich steil empfunden. Der Stapelüberlauf hat mir beim Experimentieren sehr geholfen. Es gibt ein bestimmtes Wortmakro, das ich gerne schreiben würde, aber ich habe keinen Weg gefunden, dies zu tun. Ich möchte in der Lage sein, zwei Wörter innerhalb von etwa 10 Wörtern voneinander in einem Dokument zu finden und diese Wörter dann zu kursiv zu schreiben, wenn die Wörter mehr als 10 Wörter voneinander entfernt sind oder sich in einer anderen Reihenfolge befinden. Ich möchte, dass das Makro nicht kursiv schreibt diese Wörter.

Ich habe den folgenden regulären Ausdruck verwendet:

\bPanama\W+(?:\w+\W+){0,10}?Canal\b

Allerdings kann ich nur die gesamte Zeichenfolge einschließlich der dazwischen liegenden zufälligen Wörter bearbeiten. Mit der .Replace-Funktion kann ich diese Zeichenfolge nur durch eine andere Zeichenfolge ersetzen, ohne die Formatierungsstile zu ändern.

Hat eine erfahrene Person eine Idee, wie diese funktionieren soll? Ist das überhaupt möglich?

EDIT: Hier ist was ich bisher habe. Ich habe zwei Probleme. Zuerst kann ich nicht nur die Wörter "Panama" und "Canal" aus einem übereinstimmenden regulären Ausdruck auswählen und nur diese Wörter (und nicht die Zwischenwörter) ersetzen. Zweitens weiß ich nicht, wie ich einen Regexp ersetzen soll, der einem anderen Format entspricht, nur einer anderen Textfolge - wahrscheinlich nur, weil ich mit Wortmakros nicht vertraut bin.

Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Set re = New regExp
re.Pattern = "\bPanama\W+(?:\w+\W+){0,10}?Canal\b"
re.IgnoreCase = True
re.Global = True
For Each para In ActiveDocument.Paragraphs
  Set rng = para.Range
  rng.MoveEnd unit:=wdCharacter, Count:=-1
  Text$ = rng.Text + "Modified"
  rng.Text = re.Replace(rng.Text, Text$)
Next para
End Sub

Ok, dank der Hilfe von Tim Williams unten habe ich die folgende Lösung zusammengestellt, es ist in mancher Hinsicht mehr als ein bisschen umständlich und es ist keineswegs reines Regexp, aber estut erledige den Job. Wenn jemand eine bessere Lösung oder Idee hat, wie man das macht, wäre ich fasziniert, das zu hören. Auch hier ist es etwas peinlich, dass ich die Änderungen mit der Such- und Ersetzungsfunktion erzwinge, aber zumindest funktioniert es ...

Sub RegText()
Dim re As regExp
Dim para As Paragraph
Dim rng As Range
Dim txt As String
Dim allmatches As MatchCollection, m As match
Set re = New regExp
re.pattern = "\bPanama\W+(?:\w+\W+){0,13}?Canal\b"
re.IgnoreCase = True
re.Global = True
For Each para In ActiveDocument.Paragraphs

  txt = para.Range.Text

  'any match?
  If re.Test(txt) Then
    'get all matches
    Set allmatches = re.Execute(txt)
    'look at each match and hilight corresponding range
    For Each m In allmatches
        Debug.Print m.Value, m.FirstIndex, m.Length
        Set rng = para.Range
        rng.Collapse wdCollapseStart
        rng.MoveStart wdCharacter, m.FirstIndex
        rng.MoveEnd wdCharacter, m.Length
        rng.Font.ColorIndex = wdOrange
    Next m
  End If

Next para

Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
    .Text = "Panama"
    .Replacement.Text = "Panama"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.Italic = True
With Selection.Find
    .Text = "Canal"
    .Replacement.Text = "Canal"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll

Selection.Find.ClearFormatting
Selection.Find.Font.ColorIndex = wdOrange
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Font.ColorIndex = wdBlack
With Selection.Find
    .Text = ""
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Antworten auf die Frage(2)

Ihre Antwort auf die Frage