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:
String whitespace_chars = "" /* dummy empty string for homogeneity */
+ "\\u0009" // CHARACTER TABULATION
+ "\\u000A" // LINE FEED (LF)
+ "\\u000B" // LINE TABULATION
+ "\\u000C" // FORM FEED (FF)
+ "\\u000D" // CARRIAGE RETURN (CR)
+ "\\u0020" // SPACE
+ "\\u0085" // NEXT LINE (NEL)
+ "\\u00A0" // NO-BREAK SPACE
+ "\\u1680" // OGHAM SPACE MARK
+ "\\u180E" // MONGOLIAN VOWEL SEPARATOR
+ "\\u2000" // EN QUAD
+ "\\u2001" // EM QUAD
+ "\\u2002" // EN SPACE
+ "\\u2003" // EM SPACE
+ "\\u2004" // THREE-PER-EM SPACE
+ "\\u2005" // FOUR-PER-EM SPACE
+ "\\u2006" // SIX-PER-EM SPACE
+ "\\u2007" // FIGURE SPACE
+ "\\u2008" // PUNCTUATION SPACE
+ "\\u2009" // THIN SPACE
+ "\\u200A" // HAIR SPACE
+ "\\u2028" // LINE SEPARATOR
+ "\\u2029" // PARAGRAPH SEPARATOR
+ "\\u202F" // NARROW NO-BREAK SPACE
+ "\\u205F" // MEDIUM MATHEMATICAL SPACE
+ "\\u3000" // IDEOGRAPHIC SPACE
;
/* A \s that actually works for Java’s native character set: Unicode */
String whitespace_charclass = "[" + whitespace_chars + "]";
/* A \S that actually works for Java’s native character set: Unicode */
String not_whitespace_charclass = "[^" + whitespace_chars + "]";
Ahora puede usarlo whitespace_charclass + "+"
como patrón en su replaceAll
.
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 .