Regex Word Macro, который находит два слова в диапазоне друг от друга и затем выделяет их курсивом?

Итак, я только начинаю понимать Регулярные выражения, и я нашел кривую обучения довольно крутой. Тем не менее, в процессе моих экспериментов очень важен стекопоток. Есть определенное слово макрос, который я хотел бы написать, но я не нашел способ сделать это. Я хотел бы иметь возможность найти два слова в пределах примерно 10 слов друг от друга в документе и затем выделить их курсивом, если слова разделены более чем на 10 слов или находятся в другом порядке, я хотел бы, чтобы макрос не выделял курсивом эти слова.

Я использовал следующее регулярное выражение:

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

Однако это позволяет мне манипулировать только всей строкой, включая случайные слова между ними. Также функция .Replace позволяет мне заменить эту строку другой строкой, не меняя стили форматирования.

У любого более опытного человека есть идея относительно того, как заставить это работать? Это вообще возможно сделать?

РЕДАКТИРОВАТЬ: Вот то, что я до сих пор. У меня две проблемы. Во-первых, я не знаю, как выбрать только слова «Панама». и "Канал" из подходящего регулярного выражения и замените только эти слова (а не промежуточные слова). Во-вторых, я просто не знаю, как заменить Regexp, который сопоставляется с другим форматом, только с другой строкой текста - вероятно, просто из-за недостаточного знакомства с макросами слова.

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

Хорошо, благодаря помощи Тима Уильямса, приведенной ниже, я получил следующее решение, оно более чем неуклюже в некоторых отношениях, и это ни в коем случае не просто регулярное выражение, но оноdoes справиться с работой. Если у кого-то есть лучшее решение или идея о том, как поступить, я бы с радостью его услышал. Опять же, мое грубое принуждение к изменениям с помощью функции поиска и замены немного смущает, но, по крайней мере, работает ...

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

Ответы на вопрос(2)

Ваш ответ на вопрос