2011-07-15 13 views
71

Obrazowanie próbujesz dopasować wzór "stackoverflow".Jak określić "Spacja lub koniec ciągu" i "spacja lub początek łańcucha"?

Chcesz następujące:

this is stackoverflow and it rocks [MATCH] 

stackoverflow is the best [MATCH] 

i love stackoverflow [MATCH] 

typostackoverflow rules [NO MATCH] 

i love stackoverflowtypo [NO MATCH] 

wiem, jak analizować na stackoverflow jeśli zawiera spacje po obu stronach przy użyciu:

/\s(statckoverflow)\s/ 

samo z jeśli jej na początku lub na końcu string:

/^(stackoverflow)\s/ 

/\s(stackoverflow)$/ 

Ale jak określić "spację lub koniec ciągu" i "spację lub początek struny"?

Odpowiedz

110

Można użyć dowolnego z poniższych:

\b  #A word break and will work for both spaces and end of lines. 
(^|\s) #the | means or.() is a caputuring group. 


/\b(stackoverflow)\b/ 

Ponadto, jeśli nie chcesz uwzględnić miejsca w meczu, możesz użyć funkcji lookbehind/ahead.

(?<=\s|^)   #to look behind the match 
(stackoverflow) #the string you want.() optional 
(?=\s|$)   #to look ahead. 
+6

'\ b' jest asercją o zerowej szerokości; nigdy nie zużywa żadnych znaków. Nie ma potrzeby, aby zawinąć go w obejście. –

+0

dobry punkt. Myślałem o jego oryginalnym '\ s'. Poprawię moją odpowiedź. –

+0

Należy zauważyć, że w większości implementacji regexp '\ b' jest ** tylko standardowym ASCII **, to znaczy brak obsługi standardu Unicode. Jeśli chcesz dopasować słowa unicode, nie masz wyboru, ale użyj tego: http://stackoverflow.com/a/6713327/1329367 – Mahn

41

(^|\s) dopasuje spację lub początek ciągu znaków i ($|\s) dla spacji lub końca łańcucha. Razem to:

(^|\s)stackoverflow($|\s) 
+2

to jedyny, który działa dla mnie. dziękuję @gordy – robsonrosa

+2

Jeśli użyjesz tego wzoru do zamiany, pamiętaj, aby zachować spacje w zastąpionym wyniku, zastępując wzór '$ 1 łańcuch $ 2'. – Mahn

5

\b mecze na granicach słowa (bez właściwie dopasowane żadnych znaków), więc następujące powinien zrobić to, co chcesz:

\bstackoverflow\b 
+0

AFAIK nie działa w przypadku języków innych niż łaciński. – Uri

10

Oto co chciałbym używać:

(?<!\S)stackoverflow(?!\S) 

Innymi słowy, spotkania "stackoverflow" jeśli to nie poprzedzone przez non-spacją i nie następnie przez nie-białych znaków postać.

To jest lepsze (IMO) niż podejście "spacja lub kotwica" i nie zakłada, że ​​ciąg zaczyna się i kończy przy użyciu znaków takich jak podejście \b.

+1

dobre wyjaśnienie, dlaczego warto z tego korzystać. wybrałbym to jednak testowany ciąg jest ZAWSZE pojedynczą linią. –

Powiązane problemy