Po prostu zaczynam rozumieć Wyrażenia regularne i odkryłem, że krzywa uczenia się jest dość stroma. Jednak stackoverflow był ogromnie pomocny w procesie mojego eksperymentowania. Istnieje konkretne słowo, które chciałbym napisać, ale nie znalazłem sposobu, by to zrobić. Chciałbym móc znaleźć dwa słowa w ciągu około 10 słów w dokumencie, a następnie pochylić te słowa, jeśli słowa są więcej niż 10 słów od siebie lub są w innej kolejności Chciałbym, aby makro nie pochyliło się te słowa.Regex Word Makro, które znajduje dwa słowa w zakresie od siebie nawzajem, a następnie pochyla je?
I zostały używając następującego wyrażenia regularnego:
\bPanama\W+(?:\w+\W+){0,10}?Canal\b
Jednak to tylko pozwala mi manipulować cały ciąg jako całości, w tym przypadkowych słów pomiędzy. Również funkcja .Replace pozwala tylko zastąpić ten ciąg innym ciągiem, który nie zmienia stylów formatowania.
Czy ktoś bardziej doświadczony ma pomysł, jak to zrobić? Czy to możliwe?
EDYCJA: Oto, co mam do tej pory. Mam dwa problemy. Po pierwsze 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 do innego formatu, tylko inny ciąg tekstu - prawdopodobnie właśnie w wyniku braku znajomości makr Worda.
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 Tim Williams poniżej mam następujące rozwiązanie razem, to bardziej niż trochę niezdarny pod pewnymi względami i to bynajmniej nie jest czysty regexp ale robi uzyskać Zadanie wykonane. Jeśli ktoś ma lepsze rozwiązanie lub pomysł o tym, jak to zrobić, byłbym zafascynowany, słysząc to. Ponownie, moja brute wymuszanie zmian z poszukiwaniem i zastąpienie funkcji jest trochę żenująco surowy, ale przynajmniej to 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
Obiekt Dopasuj ma właściwość Indeks, która informuje, gdzie w tekście wystąpiło dopasowanie. Możesz użyć tego do adresowania określonych zakresów, aby zmienić ich formatowanie. Jeśli zaktualizujesz pytanie, aby pokazać istniejący kod, ktoś może zadzwonić z sugerowanymi zmianami. –
pokaż mi listę słów, na których uruchamiasz wyrażenie regularne. – jared
Czy "słowa to więcej niż 10 słów" lub "wyrazy to więcej niż 10 liter" lub "zdania to więcej niż 10 słów"? – Cylian