Regex Word Makro, które znajduje dwa słowa w zakresie siebie nawzajem, a następnie kursywą te słowa?

Właśnie zaczynam rozumieć wyrażenia regularne i odkryłem, że krzywa uczenia się jest dość stroma. Jednak stackoverflow był niezwykle pomocny w procesie moich eksperymentów. Chciałbym napisać pewne makro, ale nie udało mi się tego zrobić. Chciałbym móc znaleźć w dokumencie dwa słowa w obrębie 10 lub więcej słów od siebie, a następnie zaznaczyć kursywą te słowa, jeśli słowa mają więcej niż 10 słów od siebie lub są w innej kolejności, chciałbym, aby makro nie było kursywą te słowa.

Używam następującego wyrażenia regularnego:

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

Jednak pozwala mi tylko manipulować całym łańcuchem jako całością, włączając losowe słowa pomiędzy. Również funkcja .Replace pozwala mi zastąpić ten ciąg innym ciągiem znaków, nie zmieniając stylów formatowania.

Czy jakaś bardziej doświadczona osoba ma pomysł, jak to zrobić? Czy można to zrobić?

EDIT: Oto co mam do tej pory. Mam dwa problemy, które mam. Najpierw nie wiem, jak wybrać słowa „Panama” i „Kanał” z dopasowanego wyrażenia regularnego i zastąpić tylko te słowa (a nie słowa pośrednie). Po drugie, po prostu nie wiem, jak zastąpić Regexp, który jest dopasowany innym formatem, tylko inny ciąg tekstu - prawdopodobnie w wyniku braku znajomości makr wyrazów.

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, dzięki pomocy Tima Williamsa poniżej, otrzymałem następujące rozwiązanie razem, pod pewnymi względami jest to trochę więcej niż niezgrabne i nie jest to wcale czysty regexp, alerobi zrobić robotę. Gdyby ktoś miał lepsze rozwiązanie lub pomysł na temat tego, jak to zrobić, byłbym zafascynowany, gdyby to usłyszał. Ponownie, mój brutalny wymuszanie zmian za pomocą funkcji wyszukiwania i zastępowania jest trochę krępująco prymitywny, ale przynajmniej działa ...

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

questionAnswers(2)

yourAnswerToTheQuestion