Quindi, sto appena iniziando a capire le espressioni regolari e ho trovato la curva di apprendimento abbastanza ripida. Tuttavia, StackOverflow è stato immensamente utile nel processo della mia sperimentazione. C'è una particolare parola macro che vorrei scrivere ma non ho trovato un modo per farlo. Mi piacerebbe riuscire a trovare due parole entro 10 o più parole l'una dall'altra in un documento e quindi mettere in corsivo quelle parole, se le parole sono più di 10 parole o sono in un ordine diverso vorrei che la macro non fosse in corsivo quelle parole.Regex Word Macro che trova due parole all'interno di un intervallo tra loro e quindi in corsivo di quelle parole?
Sono stato con la seguente espressione regolare:
\bPanama\W+(?:\w+\W+){0,10}?Canal\b
Tuttavia lo lascia solo a me manipolare l'intera stringa nel suo complesso tra cui parole a caso in mezzo. Anche la funzione .Replace mi consente solo di sostituire quella stringa con una stringa diversa, non di cambiare gli stili di formattazione.
Qualcuno con più esperienza ha un'idea su come farlo funzionare? È persino possibile fare?
EDIT: Ecco quello che ho finora. Ci sono due problemi che sto avendo. Innanzitutto non so come selezionare solo le parole "Panama" e "Canale" dall'interno di un'espressione regolare abbinata e sostituire solo quelle parole (e non le parole intermedie). In secondo luogo, non so come sostituire un Regexp che è abbinato a un formato diverso, solo una diversa stringa di testo - probabilmente solo a causa della mancanza di familiarità con i macro di parole.
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, grazie per l'aiuto di Tim Williams sotto ho ottenuto la seguente soluzione insieme, è più di un po 'goffo per certi aspetti e non è affatto regexp puro ma fa ottenere il lavoro fatto. Se qualcuno ha una soluzione o un'idea migliore su come procedere, sarei comunque affascinato dal sentirlo. Ancora una volta, il mio bruta costringendo i cambiamenti con la ricerca e sostituzione funzione è un po 'imbarazzante grezza ma almeno funziona ...
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
L'oggetto Match ha una proprietà Index che indica dove si è verificata la corrispondenza nel testo. Puoi usarlo per indirizzare determinati intervalli per cambiare la loro formattazione. Se aggiorni la tua domanda per mostrare il tuo codice esistente, qualcuno potrebbe intervenire con le modifiche suggerite. –
Mostrami l'elenco di parole su cui stai eseguendo la regex. – jared
E ''' le parole sono più di 10 parole'' o '' le parole sono più di 10 lettere'' o '' le frasi sono più di 10 parole''? – Cylian