Você não pode usar \s
em Java para corresponder ao espaço em branco em seu próprio conjunto de caracteres nativos, porque o Java não oferece suporte à propriedade de espaço em branco Unicode - embora isso seja estritamente necessário para atender ao RL1.2 do UTS # 18! O que ele tem não está em conformidade com os padrões, infelizmente.
O Unicode define 26 pontos de código como \p{White_Space}
: 20 deles são vários tipos de \pZ
GeneralCategory = Separator e os 6 restantes são \p{Cc}
GeneralCategory = Control .
O espaço em branco é uma propriedade bastante estável, e esses mesmos existem praticamente desde sempre. Mesmo assim, o Java não tem nenhuma propriedade que esteja em conformidade com o padrão Unicode para eles, então você deve usar um 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 + "]";
Agora você pode usar whitespace_charclass + "+"
como padrão em seu replaceAll
.
Desculpe por tudo isso. As regexes do Java simplesmente não funcionam muito bem em seu próprio conjunto de caracteres nativos e , portanto, você realmente precisa passar por obstáculos exóticos para fazê-los funcionar.
E se você acha que o espaço em branco é ruim, você deve ver o que você precisa fazer para conseguir \w
e \b
finalmente se comportar corretamente!
Sim, é possível e sim, é uma bagunça entorpecente. Isso é ser caridoso, até. A maneira mais fácil de obter uma biblioteca regex em conformidade com os padrões para Java é transferir JNI para as coisas do ICU. Isso é o que o Google faz para o Android, porque OraSun's não está à altura.
Se você não quiser fazer isso, mas ainda quiser ficar com o Java, eu tenho uma biblioteca de reescrita de regex de front-end que escrevi que "corrige" os padrões do Java, pelo menos para que estejam em conformidade com os requisitos de RL1.2a em UTS # 18, Expressões regulares Unicode .