2012-08-08 16 views
109

¿Alguien puede explicar la diferencia entre los metacaracteres de expresiones regulares \ w y \ b? Ambos estos metacaracteres se utilizan para límites de palabras. Aparte de esto, ¿qué personaje meta es eficiente para contenido multilingüe?diferencia entre w y b metaleros de expresiones regulares

+11

'\ w' representa una palabra * carácter *, mientras que' \ b' representa una palabra * límite entre * un carácter de palabra y un carácter no de palabra. No son lo mismo. – BoltClock

Respuesta

196

El metacarácter \b es un anclaje como el signo de cariño 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 las 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 en 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: \b le permite realizar un "Sólo palabras completas" búsqueda usando una expresión regular en forma de \bword\b.Un "carácter de palabra" es un personaje que se puede usar para formar palabras. Todos los caracteres que no son "caracteres de palabra" son "caracteres sin palabras".

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

\w significa "carácter de palabra", generalmente [A-Za-z0-9_]. Observe la inclusión del subrayado y los dígitos.

\B es la versión negada de \b. \B coincide en todas las posiciones donde \b no. Efectivamente, \B coincide en cualquier posición entre dos caracteres de palabras, así como en cualquier posición entre dos caracteres que no sean palabras.

\W es la abreviatura de [^\w], la versión negada de \w.

19

\w coincide con un carácter de palabra. \b es 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. (Ejemplos de cosas que no son caracteres de palabra incluyen espacios en blanco, principio y final de la cadena, etc.)

\w partidos a, b, c, d, e y f en "abc def"
\b coincide con el (cero -width) posición antes a, después de c, antes d, y después de f en "abc def"

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

+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 principio/final de la cadena. – MRAB

+0

Tienes razón, eso es más correcto. Voy a editar – jwismar

+5

Todavía no está del todo bien. '\ b' una aserción de ancho cero; no coincide con un * carácter *, coincide con una * posición *. –

6

@ Mahender, probablemente se refería a la diferencia entre \W (en lugar de \w) y \b. Si no, entonces estaría de acuerdo con @BoltClock y @jwismar arriba. De lo contrario, continúe leyendo.

\W coincidiría con cualquier carácter que no sea de palabra, por lo que es fácil de usar para que coincida con los límites de las palabras. El problema es que no coincidirá con el inicio o el final de una línea. \b es más adecuado para los límites de palabras coincidentes, 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í) \b se puede considerar como (\W|^|$). [Editar: como @ Ωmega menciona a continuación, \b es un partido de longitud cero por lo (\W|^|$) no es estrictamente correcto, pero esperemos que ayuda a explicar el cambio]

Ejemplo rápido: Para la cadena Hello World, .+\W coincidiría Hello_ (con el espacio) pero no coincidirá con World. .+\b coincidiría con Hello y World.

1

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

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

4
\b <= this is a word boundary. 

Partidos en una posición que es seguido por un carácter de palabra pero no precedidos por un carácter de palabra, o que está precedida por un carácter de palabra pero no seguidos 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 está intentando establecer la concordancia?

Algunos sitios web regex útiles para principiantes o simplemente para refrescar el apetito.

me pareció que este es un libro muy útil:

+5

Esta es una buena respuesta, pero es útil recordar que '\ w' no siempre es equivalente a los caracteres ASCII' [A-Za-z0-9_] '- también coincidirá con los puntos de código Unicode alfanuméricos, y puede coincide con los caracteres ISO-Latin-1 de 8 bits si la configuración regional está configurada correctamente. –

Cuestiones relacionadas