43 votes

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

Le JDK de la Chaîne.trim() la méthode est assez naïve, et seulement supprime les caractères de contrôle ascii.

Apache Commons StringUtils.strip() est un peu mieux, mais utilise le JDK de Caractère.isWhitespace(), qui ne reconnaît pas l'espace insécable comme des espaces.

Alors quelle serait la plus complète, Unicode-compatible, la sécurité et la bonne façon de couper une chaîne de caractères en Java?

Et d'ailleurs, est-il mieux de la bibliothèque de commons-lang que je devrais utiliser pour ce genre de choses?

59voto

CrazyCoder Points 103123

Google a mis à la goyave, les bibliothèques disponibles récemment. Il peut avoir ce que vous cherchez:

CharMatcher.inRange('\0', ' ').trimFrom(str)

est équivalente à la Chaîne.trim(), mais vous pouvez personnaliser les éléments de garniture, reportez-vous à la JavaDoc.

Par exemple, il a sa propre définition de l'ESPACE , qui ne diffère du JDK et est défini selon la dernière norme Unicode, donc, ce que vous avez besoin peut être écrite comme:

CharMatcher.WHITESPACE.trimFrom(str)

7voto

itsadok Points 12971

Je jure que je n'ai vu cela qu'après avoir posté la question: Google vient de publier Guava , une bibliothèque des principaux utilitaires Java.

Je n'ai pas encore essayé cela, mais d'après ce que je peux dire, c'est entièrement compatible Unicode:

 String s = "  \t testing \u00a0"
s = CharMatcher.WHITESPACE.trimFrom(s);
 

3voto

ZZ Coder Points 36990

Il est vraiment difficile de définir ce qui constitue des espaces blancs. Parfois, j'utilise des espaces insécables juste pour m'assurer qu'il ne soit pas supprimé. 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;
  }
 

2voto

João Silva Points 36619

J'ai toujours trouvé trim fonctionner assez bien pour presque tous les scénarios.

Toutefois, si vous voulez vraiment pour inclure davantage de personnages, vous pouvez modifier l' strip méthode de commons-lang afin d'inclure non seulement le test pour Character.isWhitespace, mais aussi pour Character.isSpaceChar qui semble être ce qu'il manque. À savoir, les lignes suivantes à l' stripStart et stripEnd, respectivement:

  • while ((start != strLen) && Character.isWhitespace(str.charAt(start)))
  • while ((end != 0) && Character.isWhitespace(str.charAt(end - 1)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X