2012-04-29 10 views
17

Próbuję wyszukać wszystkie wystąpienia "Toma", które nie są poprzedzone "Kciukiem".Wykluczenie RegExp, szukanie słowa, które nie następuje po innym

Próbowałem szukać

Tom ^((?!Thumb).)*$ 

ale wciąż linie, które pasują do Tom Thumb.

+1

Nawet w prostym przypadku, takim jak to, zawsze pomocne jest wprowadzenie niektórych danych wejściowych i oczekiwanych wyników. np. czy chcesz dopasować tylko "Tom" lub "Tom + wszystko do końca linii"? – alan

+0

Postaram się być bardziej konkretny. Chcę znaleźć dowolne wystąpienie "Toma" w dowolnym miejscu wiersza, ale nie chcę widzieć żadnej linii zawierającej "Tom Thumb" – user1364539

Odpowiedz

25

Nie mów co smak regex używasz, ale to powinno działać w ogóle:

Tom(?!\s+Thumb) 
+0

To jest wyszukiwanie tekstu uruchamiane na forum phpbb. – user1364539

+0

Nadal je otrzymuj :-( – user1364539

+3

Co masz na myśli: "nadal je zdobywaj?" Nadal dostajesz co? Abyśmy mogli Ci pomóc, musisz opublikować więcej kodu, kilka przykładowych danych wejściowych i pożądanych wyników, i więcej informacje na temat tego, co dokładnie próbujesz zrobić. To wyrażenie zdecydowanie nie będzie pasować do "Toma", a następnie "Kciuka" (o ile twoja implementacja regex obsługuje negatywne uprzedzenia), więc nie jestem pewien, co znaczy "nadal ich zdobądź". – alan

1

Tom(?!\s+Thumb) jest to, czego szukać.

2

Jeśli nie szukasz całych wyrazów, można użyć następującego wyrażenia regularnego:

Tom(?!.*Thumb) 

Zobacz this regex demo

Jeśli szukasz całych słów (czyli całe słowo Tom powinno być jedynie dopasowana jeśli nie całe słowo Thumb dalej na prawo od niego), użyj

\bTom\b(?!.*\bThumb\b) 

Zobacz another regex demo

zauważyć, że:

  • \b - mecze wiodącym/końcowe słowo granica
  • (?!.*Thumb) - to ujemny uprzedzona że nie mecz, czy są jakieś 0+ znaków (w zależności od silnika, w tym/wyłączając symbole linii łamania), a następnie Thumb.
Powiązane problemy