2012-07-28 16 views
5

Vorrei prefazione questa affermando che sto lavorando con VB6 & RegExpRegExp espressione regolare trovare e sostituire parole intere solo

Sto tentando di trovare e sostituire parole intere, da "parole intere" intendo un la corrispondenza valida non è una sottostringa di un'altra parola, anche se alcuni caratteri speciali saranno ok. Sono un principiante alle espressioni regolari. Questo è quello che stavo cercando:

([^a-z]+)(Foo)([^a-z]+) 

Sembra vicino ma ho qualche problema in determinate situazioni.

Per esempio, se trovo la stringa

Foo Foo 

o

Foo(Foo) 

o in qualsiasi punto di una linea termina con Foo e la seguente riga inizia con Foo

This is a line with Foo 
Foo starts the next line 

In ogni di questi casi viene abbinato solo il primo Foo.

Beh, forse non è un problema con la partita, ma piuttosto il mio metodo di sostituzione. Non so esattamente come posso verificarlo. Sto utilizzando gruppi di sostituire qualunque delimitazione char è compensata dalla espressione, in questo modo:

regEX.Replace(source, "$1" & newstring & "$3") 

Quindi, in sintesi voglio evitare matching: FooBar barfoo

Una delle seguenti sarebbe valido gli incontri:

Foo Foo Foo
bar
foo_bar
foo.bar
Foo, bar
Foo (bar)
Foo (Foo)

Se qualcuno può gentilmente mi mostra il modo corretto di fare questo avrei molto grato!

modificati

Sembra ho parlato un po 'troppo presto per quanto riguarda la prima soluzione qui di seguito. Dopo un po 'di test e un po' di ulteriore lettura, vedo che il carattere di sottolineatura è una parola char e quindi il pattern sopra non lo abbinerà. Sono arrivato con questo che fa il trucco, c'è un modo migliore?

(\b)(Foo)(\b|_) 

regEX.Replace(source, "$1" & newstring & "$3") 

Funziona, ma sembra un po 'sciatto.

risposta

6

Utilizzare l'espressione "limite di parole" \b.

Forse qualcosa di semplice come questo farà:

(.*)\bFoo\b(.*) 

Cordiali saluti, la parola espressione di confine \b è un match di ampiezza zero tra una parola personaggio \w ed una non-parola personaggio [^\w] o viceversa e non consuma input.


sottolineatura e cifre caratteri sono considerati "caratteri di parola", così Foo_Bar, Bar_Foo, e Foo123 non sarebbe partita. Per ovviare a questo, in modo che qualsiasi non lettera è considerato "fine della parola" (tra cui inizio e la fine di ingresso), utilizzare around sguardo:

(?i)(.*(?<![^a-z]))Foo((?![^a-z]).*) 
+1

grande grazie. Ho così tanto da imparare sulle espressioni regolari. Dovevo fare un piccolo cambiamento, ma sembra aver fatto il trucco. Semplicemente \ bFoo \ b –

+0

Beh, non era proprio perfetto. Ho modificato il mio post originale sopra. I commenti sono i benvenuti –

+0

underscore è considerato un "carattere Word", quindi '\ b' non corrisponderà tra una lettera e un trattino basso. Lì * è * un modo per farlo però. Fammi sapere se vuoi che ti mostri – Bohemian

Problemi correlati