2012-07-28 10 views
5

powinienem przedmowa tego stwierdzenia, że ​​pracuję z VB6 & RegExpRegExp wyrażenie regularne znaleźć i zastąpić całe słowa jedynie

Ja próbuje znaleźć i zastępować całe słowa, przez „całe słowa” mam na myśli Prawidłowe dopasowanie nie jest podciągiem innego słowa, chociaż niektóre znaki specjalne będą w porządku. Jestem nowicjuszem w wyrażeniach regularnych. To właśnie próbowałem:

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

Wydaje się być blisko, ale mam pewne problemy w niektórych sytuacjach.

Na przykład, jeśli znajdę ciąg

Foo Foo 

lub

Foo(Foo) 

lub gdziekolwiek linia kończy Foo i następujący wiersz zaczyna się od Foo

This is a line with Foo 
Foo starts the next line 

W dowolnym w tych przypadkach dopasowywany jest tylko pierwszy Foo.

Cóż, może to nie jest problem z meczem, ale raczej moja metoda zamiany. Nie wiem dokładnie, jak mogę to sprawdzić. Używam grupy zastąpić cokolwiek ograniczające char jest dopasowany przez wyrażenie, tak:

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

Tak w skrócie chcę uniknąć dopasowywania: FooBar barfoo

Każde z poniższych byłby ważny mecze:

Foo Foo Foo Bar

Foo_bar
foo.bar
Foo, bar
Foo (bar)
Foo (Foo)

Jeśli ktoś może łaskawie mi pokazać właściwą drogę do tego bym doceniam to zrobić!

edytowany

Wygląda Rozmawiałem trochę zbyt szybko, co do pierwszego rozwiązania poniżej. Po niewielkich testach i dalszym czytaniu widzę, że podkreślenie jest słowem char, a więc powyższy wzór nie pasuje do niego. Wpadłem na to, co działa, czy jest lepszy sposób?

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

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

Działa, ale wydaje się trochę zaniedbany.

Odpowiedz

6

Użyj wyrażenia "granica słowa" \b.

Może coś tak proste, jak to zrobi:

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

FYI, słowo granica wyrażenie \b jest zero-width mecz między słowo charakter \w i non-słowo charakter [^\w] lub odwrotnie i nie zużywa żadnych danych wejściowych.


podkreślenia i cyfrowe znaki są uważane za "znaki słowne", więc Foo_Bar, Bar_Foo i Foo123 nie będzie pasować. Aby skorygować, że tak, że dowolny non-letter jest uważany za „koniec słowa” (łącznie z początkiem i końcem wejścia), użyj arounds Wygląd:

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

wielkie dzięki. Mam dużo do nauczenia się na temat wyrażeń regularnych. Musiałem wprowadzić niewielką zmianę, ale wydaje się, że udało się to. Po prostu \ bFoo \ b –

+0

Cóż, nie było idealnie. Poprawiłem mój pierwotny post powyżej. Komentarze są mile widziane. Podkreślenie –

+0

jest uważane za "znak słowny", więc '\ b' nie będzie pasować między literą a znakiem podkreślenia. Jednak * jest * sposobem na zrobienie tego. Daj mi znać, jeśli chcesz, żebym ci pokazał – Bohemian

Powiązane problemy