Diferencia entre \ w y \ b metacaracteres de expresiones regulares

142

¿Alguien puede explicar la diferencia entre metacaracteres \by \wexpresiones regulares? Tengo entendido que estos dos metacaracteres se usan para límites de palabras. Además de esto, ¿qué meta carácter es eficiente para el contenido multilingüe?

Mahender
fuente
11
\wrepresenta un carácter de palabra , mientras que \brepresenta un límite de palabra entre un carácter de palabra y un carácter que no es de palabra. No son lo mismo.
BoltClock

Respuestas:

259

El metacarácter \bes un ancla como el símbolo de intercalación y el signo de dólar. Coincide en una posición que se llama "límite de palabra" . Este partido es de longitud cero.

Hay tres posiciones diferentes que califican como límites de palabras:

  • Antes del primer carácter de la cadena, si el primer carácter es un carácter de palabra.
  • Después del último carácter de la cadena, si el último carácter es un carácter de palabra.
  • Entre dos caracteres en la cadena, donde uno es un carácter de palabra y el otro no es un carácter de palabra.

En pocas palabras: le \bpermite realizar una búsqueda de "solo palabras completas" utilizando una expresión regular en forma de \bword\b. Un "carácter de palabra" es un carácter que puede usarse para formar palabras. Todos los caracteres que no son "caracteres de palabras" son " caracteres que no son palabras" .

En todos los sabores, los caracteres [a-zA-Z0-9_]son caracteres de palabras. Estos también se corresponden con la clase de personaje de mano corta \w. Los sabores que muestran "ascii" para los límites de palabras en la comparación de sabores solo los reconocen como caracteres de palabras.

\wsignifica "carácter de palabra" , por lo general [A-Za-z0-9_]. Observe la inclusión del guión bajo y los dígitos.

\Bes la versión negada de \b. \Bcoincide en todas las posiciones donde \bno. Efectivamente, \Bcoincide en cualquier posición entre caracteres de dos palabras, así como en cualquier posición entre dos caracteres que no son palabras.

\Wes la abreviatura de [^\w]la versión negada de \w.

Ωmega
fuente
21

\wcoincide con un caracter de palabra. \bes una coincidencia de ancho cero que coincide con un carácter de posición que tiene un carácter de palabra en un lado, y algo que no es un carácter de palabra en el otro. (Los ejemplos de cosas que no son caracteres de palabras incluyen espacios en blanco, principio y final de la cadena, etc.)

\wpartidos a, b, c, d, e, y fen "abc def"
\bcoincide con la posición (cero-anchura) antes de a, después de c, antes de d, y después de fen"abc def"

Ver: http://www.regular-expressions.info/reference.html/

jwismar
fuente
3
Es más correcto decir que es el límite entre un carácter de palabra y no un carácter de palabra porque también coincide entre un carácter de palabra y el inicio o el final de una cadena si ese carácter está al inicio / final de la cadena.
MRAB
55
Todavía no está del todo bien. \buna afirmación de ancho cero; no coincide con un personaje , coincide con una posición .
Alan Moore
10

@Mahender, probablemente quisiste decir la diferencia entre \W(en lugar de \w) y \b. Si no, estaría de acuerdo con @BoltClock y @jwismar arriba. De lo contrario, sigue leyendo.

\Wcoincidiría con cualquier carácter que no sea de palabra, por lo que es fácil tratar de usarlo para unir los límites de las palabras. El problema es que no coincidirá con el inicio o el final de una línea. \bes más adecuado para hacer coincidir los límites de las palabras, ya que también coincidirá con el inicio o el final de una línea. En términos generales (los usuarios más experimentados pueden corregirme aquí) \bpueden considerarse como (\W|^|$). [Editar: como @ Ωmega menciona a continuación, \bes una coincidencia de longitud cero, por (\W|^|$)lo que no es estrictamente correcta, pero con suerte ayuda a explicar la diferencia]

Ejemplo rápido: para la cadena Hello World, .+\Wcoincidiría Hello_(con el espacio) pero no coincidirá World. .+\bcoincidiría con ambos Helloy World.

mtariq
fuente
No estoy de acuerdo con el \bsignificado de lo mismo (\W|^|$), ya (\W|^|$)que incluirá el carácter que no sea de palabra dentro del resultado coincidente. Puede verificar este hecho aquí => regexr.com/3qf98 .
Victor
\bpara mí, significa lo mismo que (?<=\W|^|$)cuando se usa antes de un patrón y (?=\W|^|$)cuando se usa después de un patrón. Puedes consultar lo que estoy hablando aquí => regexr.com/3qf9h . Simplemente compare con el resultado de las \banclas aquí => regexr.com/3qf9t
Victor
4
\b <= this is a word boundary.

Coincide en una posición seguida de un carácter de palabra pero no precedida por un carácter de palabra, o que está precedida por un carácter de palabra pero no seguido por un carácter de palabra.

\w <= stands for "word character". 

Siempre coincide con los caracteres ASCII [A-Za-z0-9_]

¿Hay algo específico que intentas hacer coincidir?

Algunos sitios web de expresiones regulares útiles para principiantes o simplemente para calmar el apetito.

Encontré que este es un libro muy útil:

James Emanon
fuente
55
Esta es una buena respuesta, pero es útil recordar que \wno siempre es equivalente a los caracteres ASCII [A-Za-z0-9_]: también coincidirá con puntos de código alfanuméricos Unicode y puede coincidir con caracteres ISO-Latin-1 de 8 bits si la configuración regional está configurada adecuadamente .
Tim Pierce
2

\wes no un límite de palabra, que coincide con cualquier carácter de palabra, incluyendo guiones: [a-zA-Z0-9_]. \b es un límite de palabra, es decir, coincide con la posición entre una palabra y un carácter no alfanumérico: \Wo [^\w].

Sin embargo, estas implementaciones pueden variar de un idioma a otro.

Julián Urbano
fuente