Vous ne pouvez pas utiliser \s
en Java pour faire correspondre l'espace blanc sur son propre jeu de caractères natif, car Java ne prend pas en charge la propriété d'espace blanc Unicode - même si cela est strictement nécessaire pour respecter la RL1.2 de UTS # 18! Ce qu'il a n'est hélas pas conforme aux normes.
Unicode définit 26 points de code comme suit \p{White_Space}
: 20 d'entre eux sont différentes sortes de \pZ
GeneralCategory = Separator , et les 6 restants sont \p{Cc}
GeneralCategory = Control .
L'espace blanc est une propriété assez stable, et ces mêmes existent depuis presque toujours. Même ainsi, Java n'a pas de propriété conforme à la norme Unicode pour ceux-ci, vous devez donc utiliser un code comme celui-ci:
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 + "]";
Vous pouvez maintenant l'utiliser whitespace_charclass + "+"
comme modèle dans votre fichier replaceAll
.
Désolé pour tout ça. Les expressions régulières de Java ne fonctionnent tout simplement pas très bien sur son propre jeu de caractères natif, et vous devez donc vraiment sauter à travers des cerceaux exotiques pour les faire fonctionner.
Et si vous pensez que les espaces blancs sont mauvais, vous devriez voir ce que vous devez faire pour obtenir \w
et \b
enfin se comporter correctement!
Oui, c'est possible, et oui, c'est un désordre hallucinant. C'est même de la charité. Le moyen le plus simple d'obtenir une bibliothèque de regex conforme aux normes pour Java est d'utiliser JNI vers ICU. C'est ce que fait Google pour Android, car OraSun n'est pas à la hauteur.
Si vous ne voulez pas faire cela mais que vous voulez toujours vous en tenir à Java, j'ai une bibliothèque de réécriture de regex frontale que j'ai écrite qui «corrige» les modèles de Java, au moins pour les rendre conformes aux exigences de RL1.2a en UTS # 18, Expressions régulières Unicode .