Diferencia entre \ by \ B en expresiones regulares


103

Estoy leyendo un libro sobre expresiones regulares y encontré este ejemplo para \b:

El gato esparció su comida por toda la habitación.

El uso de expresiones regulares - \bcat\bcoincidirá con la palabra catpero no la catde scattered.

Para \Bel autor usa el siguiente ejemplo:

Ingrese la identificación de nueve dígitos ya que

aparece en su contraseña codificada por colores.

Usar \B-\Bcoincidencias de expresiones regulares -entre la palabra color - coded. El uso, \b-\bpor otro lado, coincide con -in nine-digity pass-key.

¿Cómo es que en el primer ejemplo usamos \bpara separar caty en el segundo usamos \Bpara separar -? Usar \ben el segundo ejemplo hace lo contrario de lo que hizo antes.

Por favor explícame la diferencia.

EDITAR: Además, ¿alguien puede explicar con un nuevo ejemplo?

Respuestas:


84

La confusión se debe a que su pensamiento \bcoincide con los espacios (probablemente porque "b" sugiere "en blanco").

\bcoincide con la cadena vacía al principio o al final de una palabra . \Bcoincide con la cadena vacía no al principio o al final de una palabra. La clave aquí es que "-" no es parte de una palabra. Entonces <left>-<right>coincide \b-\bporque hay límites de palabras a ambos lados del -. Por otro lado, para <left> - <right>(observe los espacios), no hay límites de palabras a ambos lados del guión. Los límites de las palabras están un espacio más a la izquierda y a la derecha.

Por otro lado, al buscar \bcat\blímites de palabras, se comporta de manera más intuitiva y coincide con "gato" como se esperaba.


2
Sí, de hecho estaba confundiendo \ b con un espacio en blanco. Sin embargo, todavía me siento un poco confundido. ¿Puedo pedirte un ejemplo más?
Stirredo

3
La clave es que -no se considera parte de una palabra. Del mismo modo, !no es parte de una palabra. Así que nuevamente \b!\bcoincide con "uunet! Iamold", pero no con "Wow! You are". Puede probar estas cosas en regexpal.com .
andrewdski

@andrewdski En mi caso, \ b detecta también las puntuaciones ... Intenté con \ b [A-Z0-9] + \ b en 1987894, 3219800; 234567, 345261. y funciona bien, solo
obtengo

1
Solo agrego que un trabajo en expresiones regulares se compone de letras (a– z y A– Z), dígitos y el “_” [guión bajo]). Todo lo demás no es palabra.
Maralc

¿Podría alguien elaborar esta línea\B matches the empty string not at the beginning or end of a word
Arun Gowda

68

\bes un límite de palabra de ancho cero. Específicamente:

Coincide en la posición entre un carácter de palabra (cualquier cosa que coincida con \ w) y un carácter que no sea de palabra (cualquier cosa que coincida con [^ \ w] o \ W), así como al principio y / o al final de la cadena si la primera y / o los últimos caracteres de la cadena son caracteres de palabra.

Ejemplo: .\bcoincide cconabc

\Bes un límite sin palabras de ancho cero. Específicamente:

Coincide en la posición entre dos caracteres de palabra (es decir, la posición entre \ w \ w) así como en la posición entre dos caracteres que no son de palabra (es decir, \ W \ W).

Ejemplo: \B.\Bcoincide bconabc

Consulte regular-expressions.info para obtener más información sobre expresiones regulares


10
+1 porque el ancho cero es una parte importante de la definición. Si no fuera de ancho cero, también tomaría esos caracteres de palabra / no palabra en la parte coincidente del patrón.
Ben Hocking

5
En otras palabras, \ B coincide con el lugar entre \ W y \ W o entre \ w y \ w, pero no entre \ W y \ w.

1
Esta respuesta se ha agregado a las preguntas frecuentes sobre expresiones regulares de desbordamiento de pila , en "Anclajes".
aliteralmind

1
@stephenhuh string.match()devuelve solo la primera coincidencia, a menos que agregue la bandera globalg : "abc def".match(/\b./g)devuelve['a', ' ', 'd']
Bohemio

1
Creo que esta es la mejor respuesta. Yo también debería ser el aceptado porque resuelve la confusión. Mucho más para aprender aquí.
Wolf

38

Con un ejemplo diferente:

Considere que esta es la cadena y el patrón que se debe buscar es 'gato':

text = "catmania thiscat thiscatmaina";

Ahora definiciones,

'\ b' busca / coincide con el patrón al principio o al final de cada palabra.

'\ B' no encuentra / coincide con el patrón al principio o al final de cada palabra.

Diferentes casos:

Caso 1: Al comienzo de cada palabra

result = text.replace(/\bcat/g, "ct");

Ahora, el resultado es "ctmania thiscat thiscatmaina"

Caso 2: al final de cada palabra

result = text.replace(/cat\b/g, "ct");

Ahora, el resultado es "catmania thisct thiscatmaina"

Caso 3: No al principio

result = text.replace(/\Bcat/g, "ct");

Ahora, el resultado es "catmania thisct thisctmaina"

Caso 4: No al final

result = text.replace(/cat\B/g, "ct");

Ahora, el resultado es "ctmania thiscat thisctmaina"

Caso 5: Ni principio ni fin

result = text.replace(/\Bcat\B/g, "ct");

Ahora, el resultado es "catmania thiscat thisctmaina"

Espero que esto ayude :)


Corríjame si me equivoco por favor, pero, al usar \ bcat \ b, si nuestra cadena hubiera sido, por ejemplo: "catcat es mi gato" => la primera palabra (catcat) se habría aplicado a esta condición. ¿No?.
Kosem

8

El metacarácter \ b es un ancla como el símbolo de intercalación y el signo de dólar. Coincide en una posición que se denomina "límite de palabras". Esta coincidencia 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 una 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.

\ 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 palabra así como en cualquier posición entre dos caracteres que no son de palabra.

Fuente: http://www.regular-expressions.info/wordbo limits.html


3

\bcoincide con un límite de palabras. \Bcoincide con límites sin palabras, y es equivalente a (¡gracias a @Alan Moore por la corrección!) . Ambos son de ancho cero.[^\b](?!\b)

Consulte http://www.regular-expressions.info/wordbo limits.html para obtener más detalles. El sitio es extremadamente útil para muchas preguntas básicas sobre expresiones regulares.


4
\Bno es equivalente a [^\b]. Una clase de caracteres ( [...]o [^...]) consume exactamente un carácter, mientras que a las afirmaciones de ancho cero les gusta \by \Bno consumen nada. Si pones \buna clase de carácter, toma un significado completamente diferente: [\b]coincide con un retroceso y [^\b]coincide con cualquier carácter excepto con un retroceso. \Bes realmente equivalente a (?!\b).
Alan Moore

@ Alan gracias, tienes toda la razón: no estaba despierto esta mañana cuando escribí eso. Fijo.
Matt Ball

4
... pero no entiendo por qué alguien querría hacer coincidir un retroceso. : D
Alan Moore

1

Tomemos una cadena como:

XIX IXI XX XI II IIXX XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-

Nota: El subrayado (_) no se considera un carácter especial en este caso.

  1. /\bX\b/g Debe comenzar y terminar con un carácter especial o un espacio en blanco

XIX IXI XX X I II IIXX XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_X _X-


  1. /\bX/g Debe comenzar con un carácter especial o un espacio en blanco

X IX IXI X X X I II IIXX X XII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X _X _X-


  1. /X\b/g Debe terminar con un carácter especial o un espacio en blanco

XI X IXI X X X I II IIX X XXII II X - X - X X - X -I I- X - X - -I- X - X -I I- X - X -I- X_ X _ X -


  1. /\BX\B/g
    No debe comenzar ni terminar con un carácter especial o un espacio en blanco

XIX I X I XX XI II II X X X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_X _X-


  1. /\BX/gNo debe comenzar con un carácter especial o un espacio en blanco

XI X I X I X X XI II II XX X X II II XX -X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -


  1. /X\B/gNo debe terminar con un carácter especial o un espacio en blanco

X IX I X I X X XI II II X X XX II II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\bX\B/gDebe comenzar y no terminar con un carácter especial o un espacio en blanco

X IX IXI X X XI II II X X X XII II XX -X X- XI IX -X- -IX -XI IX- XI- X _X _X-


  1. /\BX\b/gNo debe comenzar y debe terminar con un carácter especial o un espacio en blanco

XI X IXI X X XI II IIX X XXII II XX -X X- XI IX -X- -IX -XI IX- XI- X_ X _ X -


1

Fuente © Copyright RexEgg.com

Límite de palabra: \ b *

El límite de la palabra \ b coincide con las posiciones en las que un lado es un carácter de palabra (generalmente una letra, un dígito o un guión bajo, pero vea a continuación las variaciones entre los motores) y el otro lado no es un carácter de palabra (por ejemplo, puede ser el comienzo de la cadena o un carácter de espacio).

La expresión regular \ bcat \ b, por lo tanto, coincidiría con gato en un gato negro, pero no con catatónico, tomcat o certificado. Eliminando uno de los límites, \ bcat coincidiría con cat en bagre y cat \ b coincidiría con cat en tomcat, pero no al revés. Ambos, por supuesto, coincidirían con el gato por sí solos.

Límite de no-una-palabra: \ B

\ B coincide con todas las posiciones donde \ b no coincide. Por tanto, coincide:

✽ Cuando ninguno de los lados es un carácter de palabra, por ejemplo, en cualquier posición de la cadena $ = (@ -% ++) (incluido el principio y el final de la cadena)

✽ Cuando ambos lados son un carácter de palabra, por ejemplo, entre la H y la i en ¡Hola!

Esto puede no parecer muy útil, pero a veces \ B es justo lo que desea. Por ejemplo,

✽ \ Bcat \ B encontrará cat completamente rodeado de caracteres de palabras, como en el certificado, pero no solo ni al principio o al final de las palabras.

✽ cat \ B encontrará cat tanto en certificado como en bagre, pero ni en tomcat ni por sí solo.

✽ \ Bcat encontrará gato tanto en certificado como en gato, pero ni en bagre ni por sí solo.

✽ \ Bcat | cat \ B encontrará un gato en una situación incrustada, por ejemplo, en un certificado, un bagre o un gato, pero no solo.


1

\ b se usa como límite de palabras

word = "categorical cat"

Buscar todo "gato" en la palabra anterior

sin \ b

re.findall(r'cat',word)
['cat', 'cat']

con B

re.findall(r'\bcat\b',word)
['cat']

0

\Bno es, \bpor ejemplo, negativo \b

pass-keyaquí no hay un límite de palabras al lado, -por lo que coincide \Ben su primer ejemplo, hay un límite de palabras al lado de gato, por lo que coincide\b

también se aplican reglas similares para otros. \Wes negativo de \w \UPPER CASEes negativo de\LOWER CASE

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.