web-dev-qa-db-fra.com

Comment couper correctement les espaces d'une chaîne en Java?

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?

38
itsadok

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)
57
CrazyCoder

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);
7
itsadok

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;
  }
2
ZZ Coder

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.isSpaceCharque 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)))
2
João Silva

__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;
    }
1
Ertuğrul Çetin

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.

0
Aleksandr Dubinsky