2011-07-15 17 views
71

Imaging está intentando hacer coincidir el patrón "stackoverflow".Cómo especificar "Espacio o final de cadena" y "espacio o inicio de cadena"?

desea que el siguiente:

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] 

Sé cómo analizar a cabo stackoverflow si tiene espacios en ambos sitios usando:

/\s(statckoverflow)\s/ 

mismo con si es al principio o al final de una cadena:

/^(stackoverflow)\s/ 

/\s(stackoverflow)$/ 

Pero, ¿cómo se especifica "espacio o final de la secuencia" y "espacio o inicio de la cadena"?

Respuesta

110

Puede utilizar cualquiera de los siguientes:

\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/ 

Además, si no desea incluir el espacio en su coincidencia, puede usar lookbehind/aheads.

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

'\ b' es una aserción de ancho cero; nunca consume ningún personaje. No hay necesidad de envolverlo en un vistazo. –

+0

buen punto. Estaba pensando en su '' s original. Ajustaré mi respuesta. –

+0

Tenga en cuenta que en la mayoría de las implementaciones de expresiones regulares, '\ b' es ** estándar ASCII solamente **, es decir, no admite Unicode. Si necesita unir palabras unicode, no tiene más opción que usar esto en su lugar: http://stackoverflow.com/a/6713327/1329367 – Mahn

41

(^|\s) coincidiría con el espacio o el inicio de la cadena y ($|\s) para el espacio o el final de la cadena. Juntos es:

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

este es el único que funciona para mí. gracias @gordy – robsonrosa

+2

Si usa este patrón para reemplazar, recuerde mantener los espacios en el resultado reemplazado reemplazando con el patrón '$ 1string $ 2'. – Mahn

5

\b partidos en los límites de palabra (sin llegar a Cualquiera de caracteres), por lo que el siguiente debe hacer lo que quiera:

\bstackoverflow\b 
+0

AFAIK no funciona para idiomas no latinos. – Uri

10

Esto es lo que yo usaría:

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

En otras palabras, un partido "Stackoverflow" si no es precedido por un personaje no está en blanco y no seguido por un no-espacio en blanco personaje.

Esto es más limpio (IMO) que el enfoque de "espacio-o-ancla", y no supone que la cadena se inicie y termine con caracteres de palabras como el enfoque \b.

+1

buena explicación sobre por qué usar esto. Yo hubiera escogido esto sin embargo la cadena que se está probando SIEMPRE es una sola línea. –

Cuestiones relacionadas