La API de Java para expresiones regulares indica que \s
coincidirán con los espacios en blanco. Entonces, la expresión regular \\s\\s
debe coincidir con dos espacios.
Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");
El objetivo de esto es reemplazar todas las instancias de dos espacios en blanco consecutivos con un solo espacio. Sin embargo, esto no funciona realmente.
¿Estoy teniendo un malentendido grave de las expresiones regulares o el término "espacio en blanco"?
"abc \xA0 def \x85 xyz"
para ver lo que quiero decir: solo hay tres campos allí.Respuestas:
Sí, necesitas obtener el resultado de
matcher.replaceAll()
:fuente
No puede usar
\s
en Java para hacer coincidir el espacio en blanco en su propio conjunto de caracteres nativo, porque Java no es compatible con la propiedad de espacio en blanco Unicode, ¡aunque hacerlo es estrictamente necesario para cumplir con el RL1.2 de UTS # 18! Lo que sí tiene no es conforme con los estándares, por desgracia.Unicode define 26 puntos de código como
\p{White_Space}
: 20 de ellos son varios tipos de\pZ
GeneralCategory = Separator , y los 6 restantes son\p{Cc}
GeneralCategory = Control .El espacio en blanco es una propiedad bastante estable, y esos mismos han existido prácticamente desde siempre. Aun así, Java no tiene ninguna propiedad que cumpla con el estándar Unicode para estos, por lo que debe usar un código como este:
Ahora puede usarlo
whitespace_charclass + "+"
como patrón en sureplaceAll
.Lo siento por todo eso. Las expresiones regulares de Java simplemente no funcionan muy bien en su propio conjunto de caracteres nativo, por lo que realmente tienes que pasar por aros exóticos para que funcionen.
Y si crees que los espacios en blanco son malos, ¡deberías ver lo que tienes que hacer para conseguir
\w
y\b
finalmente comportarte correctamente!Sí, es posible, y sí, es un lío alucinante. Eso es ser caritativo, incluso. La forma más fácil de obtener una biblioteca de expresiones regulares que cumpla con los estándares para Java es pasar de JNI a las cosas de ICU. Eso es lo que hace Google para Android, porque OraSun no está a la altura.
Si no quiere hacer eso pero aún quiere seguir con Java, tengo una biblioteca de reescritura de expresiones regulares de front-end que escribí que "corrige" los patrones de Java, al menos para que se ajusten a los requisitos de RL1.2a en UTS # 18, Expresiones regulares Unicode .
fuente
Para Java (no php, no javascript, no cualquier otro):
fuente
cuando envié una pregunta a un foro de Regexbuddy (aplicación de desarrollador de expresiones regulares), obtuve una respuesta más exacta a mi pregunta de Java:
"Autor del mensaje: Jan Goyvaerts
En Java, las abreviaturas \ s, \ d y \ w solo incluyen caracteres ASCII. ... Esto no es un error en Java, sino simplemente una de las muchas cosas que debe tener en cuenta al trabajar con expresiones regulares. Para hacer coincidir todos los espacios en blanco Unicode, así como los saltos de línea, puede usar [\ s \ p {Z}] en Java. RegexBuddy aún no admite propiedades específicas de Java como \ p {javaSpaceChar} (que coincide exactamente con los mismos caracteres que [\ s \ p {Z}]).
... \ s \ s coincidirá con dos espacios, si la entrada es solo ASCII. El verdadero problema es con el código del OP, como lo indica la respuesta aceptada en esa pregunta ".
fuente
[\s\p{z}]
omite el carácter Unicode de "línea siguiente" U + 0085. Utilice[\s\u0085\p{Z}]
.Parece funcionar para mi:
imprimirá:
Creo que tenías la intención de hacer esto en lugar de tu código:
fuente
Para su propósito, puede utilizar este fragmento:
Esto normalizará el espaciado a sencillo y también eliminará los espacios en blanco iniciales y finales.
fuente
fuente
Java ha evolucionado desde que se planteó este problema por primera vez. Puede hacer coincidir todo tipo de caracteres de espacio Unicode utilizando el
\p{Zs}
grupo.Por lo tanto, si desea reemplazar uno o más espacios exóticos con un espacio simple, puede hacer esto:
También vale la pena saber, si ha utilizado la
trim()
función de cadena que debe tomar un vistazo a la (relativamente nuevo)strip()
,stripLeading()
ystripTrailing()
funciones en las cadenas. Puede ayudarlo a recortar todo tipo de caracteres de espacios en blanco retorcidos. Para obtener más información sobre qué espacio está incluido, consulte laCharacter.isWhitespace()
función de Java .fuente
El uso de espacios en blanco en RE es un fastidio, pero creo que funcionan. El problema del OP también se puede resolver usando StringTokenizer o el método split (). Sin embargo, para usar RE (descomente println () para ver cómo el comparador está dividiendo la cadena), aquí hay un código de muestra:
Produce lo siguiente (compilar con javac y ejecutar en el símbolo del sistema):
% java Two21WS Inicial: "ab cdef gh ij kl" Two21WS: "ab cdef gh ij kl"
fuente
replaceAll()
?