Estoy usando expresiones regulares Java en Java 1.6 (para analizar la salida numérica, entre otros propósitos) y no puedo encontrar una definición precisa de \b
("límite de palabra"). Supuse que -12
sería una "palabra entera" (emparejada por \b\-?\d+\b
) pero parece que esto no funciona. Estaría agradecido de saber formas de unir números separados por espacios.
Ejemplo:
Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());
Esto devuelve:
true
false
true
regex
word-boundary
peter.murray.rust
fuente
fuente
Respuestas:
Un límite de palabras, en la mayoría de los dialectos de expresiones regulares, es una posición entre
\w
y\W
(sin caracteres de palabras), o al principio o al final de una cadena si comienza o termina (respectivamente) con un carácter de palabra ([0-9A-Za-z_]
).Entonces, en la cadena
"-12"
, coincidiría antes del 1 o después del 2. El guión no es un carácter de palabra.fuente
\b
es una aserción de ancho cero que coincide si hay\w
en un lado y si hay\W
en el otro o la posición es el comienzo o el final de la cadena.\w
se define arbitrariamente como caracteres "identificadores" (alnums y guiones bajos), no como algo especialmente útil para el inglés.\bhello\b
sin utilizar\b
(usando\w
,\W
y otros)?(^|\W)hello($|\W)
o menos : excepto que no capturaría ningún carácter que no sea una palabra antes y después, por lo que sería más parecido(^|(?<=\W))hello($|(?=\W))
(usando afirmaciones de búsqueda anticipada / posterior).(?<!\w)hello(?!\w)
.Un límite de palabra puede ocurrir en una de tres posiciones:
Los caracteres de palabras son alfanuméricos; un signo menos no lo es. Tomado de Regex Tutorial .
fuente
En el curso de aprendizaje de la expresión regular, que era realmente atascado en el metacarácter que es
\b
. De hecho, no comprendí su significado mientras me preguntaba " qué es, qué es " repetidamente. Después de algunos intentos al usar el sitio web , observo los guiones verticales de color rosa al comienzo de cada palabra y al final de las palabras. Lo entendí bien en ese momento. Ahora es exactamente word (\w
) -boundary .Mi opinión es meramente orientada a la comprensión inmensa. La lógica detrás de esto debe examinarse a partir de otras respuestas.
fuente
Un límite de palabra es una posición precedida por un carácter de palabra y no seguida por una, o seguida de un carácter de palabra y no precedida por una.
fuente
Hablo acerca de qué
\b
límites de expresión regular de estilo hay realmente aquí .La historia corta es que son condicionales . Su comportamiento depende de lo que están al lado.
A veces eso no es lo que quieres. Vea mi otra respuesta para más detalles.
fuente
Me gustaría explicar la respuesta de Alan Moore
Supongamos que tengo una cadena "Esto es una c a t, y ella es una maravillosa", y se supone que debo reemplazar todas las ocurrencias de la letra 'a' solo si esta letra existe en el "Límite de una palabra" , es decir la letra
a
dentro de 'gato' no debe ser reemplazada.Así que realizaré expresiones regulares (en Python ) como
re.sub("\ba","e", myString.strip())
// reemplazara
cone
por lo que la salida será Esto es
e
c un te
nd ella dee
wesomefuente
Me encontré con un problema aún peor cuando la búsqueda de texto de palabras como
.NET
,C++
,C#
, yC
. Se podría pensar que los programadores de computadoras sabrían mejor que nombrar un idioma para lo cual es difícil escribir expresiones regulares.De todos modos, esto es lo que descubrí (resumido principalmente en http://www.regular-expressions.info , que es un gran sitio): en la mayoría de los sabores de expresiones regulares, los caracteres que coinciden con la clase de caracteres abreviados
\w
son los caracteres que se tratan como caracteres de palabras por límites de palabras. Java es una excepción. Java admite Unicode para\b
pero no para\w
. (Estoy seguro de que había una buena razón para ello en ese momento).Las
\w
siglas de "carácter de palabra". Siempre coincide con los caracteres ASCII[A-Za-z0-9_]
. Observe la inclusión del guión bajo y los dígitos (¡pero no el guión!). En la mayoría de los sabores que admiten Unicode,\w
incluye muchos caracteres de otros scripts. Hay mucha inconsistencia sobre qué personajes están realmente incluidos. Generalmente se incluyen letras y dígitos de scripts alfabéticos e ideógrafos. Los signos de puntuación del conector que no sean el subrayado y los símbolos numéricos que no son dígitos pueden o no estar incluidos. El esquema XML y XPath incluso incluyen todos los símbolos\w
. Pero Java, JavaScript y PCRE solo coinciden con los caracteres ASCII\w
.Es por eso que las búsquedas de expresiones regulares basadas en Java buscan
C++
,C#
o.NET
(incluso cuando recuerdas escapar del período y las ventajas) se atornillan\b
.Nota: No estoy seguro de qué hacer con los errores en el texto, como cuando alguien no pone un espacio después de un punto al final de una oración. Lo permití, pero no estoy seguro de que sea necesariamente lo correcto.
De todos modos, en Java, si está buscando texto para esos lenguajes con nombres extraños, debe reemplazarlo
\b
con espacios en blanco y designadores de puntuación antes y después. Por ejemplo:Luego, en su prueba o función principal:
PD: ¡Gracias a http://regexpal.com/ sin el cual el mundo regex sería muy miserable!
fuente
C#
Consulte la documentación sobre condiciones de contorno:
http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html
Mira esta muestra:
Cuando lo imprima, observe que el resultado es este:
[Encontré el valor -, en mi cadena.]
Esto significa que el carácter "-" no se selecciona como el límite de una palabra porque no se considera un carácter de palabra. Parece que @brianary me dio una paliza, por lo que recibe un voto positivo.
fuente
El límite de palabra \ b se usa donde una palabra debe ser un carácter de palabra y otra un carácter que no sea de palabra. La expresión regular para número negativo debe ser
comprobar DEMO de trabajo
fuente
Creo que su problema se debe al hecho de que
-
no es un carácter de palabra. Por lo tanto, el límite de la palabra coincidirá después de-
y, por lo tanto, no lo capturará. Los límites de palabras coinciden antes del primero y después de los últimos caracteres de una cadena, así como en cualquier lugar donde antes sea un carácter de palabra o un carácter que no sea de palabra, y después es lo contrario. También tenga en cuenta que el límite de palabra es una coincidencia de ancho cero.Una alternativa posible es
Esto coincidirá con cualquier número que comience con un carácter de espacio y un guión opcional, y que termine en un límite de palabra. También coincidirá con un número que comienza al principio de la cadena.
fuente
Creo que es el límite (es decir, el seguimiento de caracteres) de la última coincidencia o el comienzo o el final de la cadena.
fuente
\G
: coincide con el comienzo de la cadena (como\A
) en el primer intento de coincidencia; después de eso coincide con la posición donde terminó el partido anterior.cuando usa
\\b(\\w+)+\\b
eso significa coincidencia exacta con una palabra que contiene solo caracteres de palabras([a-zA-Z0-9])
en su caso, por ejemplo entorno
\\b
a principios de expresiones regulares aceptará-12
(con espacio) pero de nuevo no aceptará-12
(sin espacio)para referencia para apoyar mis palabras: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html
fuente