La méthode String.trim () du JDK est plutôt naïve et ne supprime que les caractères de contrôle ascii.
Apache Commons ' StringUtils.strip () est légèrement meilleur, mais utilise le Character.isWhitespace () du JDK - =, qui ne reconnaît pas l'espace insécable comme un espace blanc .
Quel serait donc le moyen le plus complet, le plus sûr et le plus compatible avec Unicode, de couper une chaîne en Java?
Et accessoirement, y a-t-il une meilleure bibliothèque que commons-lang
que je devrais utiliser pour ce genre de choses?
Google a mis à disposition récemment goyava-libraries . Il peut avoir ce que vous recherchez:
CharMatcher.inRange('\0', ' ').trimFrom(str)
est équivalent à String.trim (), mais vous pouvez personnaliser les éléments à rogner, reportez-vous à la JavaDoc.
Par exemple, il a sa propre définition de WHITESPACE qui diffère du JDK et est définie selon le dernier standard Unicode.
CharMatcher.WHITESPACE.trimFrom(str)
Je jure que je ne l'ai vu qu'après avoir posé la question: Google vient de publier Guava , une bibliothèque d'utilitaires Java de base.
Je n'ai pas encore essayé cela, mais d'après ce que je peux en dire, c'est entièrement compatible Unicode:
String s = " \t testing \u00a0"
s = CharMatcher.WHITESPACE.trimFrom(s);
C'est vraiment difficile de définir ce qui constitue des espaces blancs. Parfois, j'utilise des espaces insécables pour m'assurer que rien ne se dépouille. Il sera donc difficile de trouver une bibliothèque pour faire exactement ce que vous voulez.
J'utilise ma propre garniture () si je veux couper chaque espace blanc. Voici la fonction que j'utilise pour vérifier les espaces blancs,
public static boolean isWhitespace (int ch)
{
if (ch == ' ' || (ch >= 0x9 && ch <= 0xD))
return true;
if (ch < 0x85) // short-circuit optimization.
return false;
if (ch == 0x85 || ch == 0xA0 || ch == 0x1680 || ch == 0x180E)
return true;
if (ch < 0x2000 || ch > 0x3000)
return false;
return ch <= 0x200A || ch == 0x2028 || ch == 0x2029
|| ch == 0x202F || ch == 0x205F || ch == 0x3000;
}
J'ai toujours trouvé que trim
fonctionnait assez bien pour presque tous les scénarios.
Cependant, si vous voulez vraiment inclure plus de caractères, vous pouvez éditer la méthode strip
de commons-lang
pour inclure non seulement le test pour Character.isWhitespace
, mais également pourCharacter.isSpaceChar
que semble être ce qui manque. À savoir, les lignes suivantes à stripStart
et stripEnd
, respectivement:
while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))
__appel__
public static String trimAdvanced(String value) {
Objects.requireNonNull(value);
int strLength = value.length();
int len = value.length();
int st = 0;
char[] val = value.toCharArray();
if (strLength == 0) {
return "";
}
while ((st < len) && (val[st] <= ' ') || (val[st] == '\u00A0')) {
st++;
if (st == strLength) {
break;
}
}
while ((st < len) && (val[len - 1] <= ' ') || (val[len - 1] == '\u00A0')) {
len--;
if (len == 0) {
break;
}
}
return (st > len) ? "" : ((st > 0) || (len < strLength)) ? value.substring(st, len) : value;
}
Cela gère les caractères Unicode et ne nécessite pas de bibliothèques supplémentaires:
String trimmed = original.replaceAll ("^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$", "");
Un léger problème est qu'il existe certains caractères d'espacement, sans propriété Unicode "WSpace = Y", répertoriés dans Wikipedia . Cela ne posera probablement pas de problème, mais vous pouvez également les ajouter facilement à la classe de caractères.
Avec almson-regex la regex ressemblera à:
String trimmed = original.replaceAll (either (START_BOUNDARY + oneOrMore (WHITESPACE), oneOrMore (WHITESPACE) + END BOUNDARY), "");
et incluez le plus pertinent des espaces non Unicode.