Combien d'espaces Java String.trim () supprimera-t-il?


117

En Java, j'ai une chaîne comme celle-ci:

"     content     ".

Est-ce que String.trim()supprimer tous les espaces sur ces côtés ou juste un espace sur chacun?


197
Aux votes négatifs: votre comportement est condescendant. Cette question est détaillée et spécifique, écrite clairement et simplement, intéressant au moins un autre programmeur quelque part. Les gens peuvent ne pas savoir où chercher pour trouver le javadoc ou le code source. Notre travail est de les aider, pas de les dénigrer pour leur ignorance.
glmxndr

14
@subtenante, vous avez raison. J'ai même déjà défendu des gens pour avoir posé des questions google. Cependant, quelque chose d'aussi simple que cela devrait être testé par lui-même, et l'OMI ne devrait JAMAIS justifier la publication d'une question sur un site de questions-réponses. Le titre est trompeur et le Q est une perte de temps pour tous ceux qui le lisent.
Chris

9
@Chris: oneat m'a donné l'occasion de regarder le code source. J'ai beaucoup appris sur trim (). Je ne l'aurais pas fait autrement. Chacun est responsable de ses propres dépenses de son temps. Il ne faut pas blâmer uneat pour notre incapacité à tirer profit de sa question apparemment naïve.
glmxndr

1
@skaffman: (c) devrait être "essayez-le et voyez", et alors seulement (d) demandez sur SO.
Mac

2
Cette question semble être hors sujet car il s'agit de quelque chose que tout le monde devrait pouvoir trouver dans le manuel ET tester en moins d'une minute.
Jasper

Réponses:


168

Tous .

Renvoie : Une copie de cette chaîne avec les espaces blancs de début et de fin supprimés, ou cette chaîne s'il n'y a pas d'espace blanc de début ou de fin.

~ Cité de la documentation Java 1.5.0

(Mais pourquoi n'avez-vous pas simplement essayé et vu par vous-même?)


1
J'ai dû voter à la baisse car cette réponse ne couvre pas ce que la documentation entend par "espace blanc". Il semblerait logique que ce soit là où Chararacter.isWhitespaceest vrai, mais ce n'est pas ce que cela signifie par "espace blanc" ..
user2864740

7
@ user2864740: Cette réponse n'est pas destinée à être une analyse complète de trim, isWhiteSpaceetc., ou une discussion des ambiguïtés dans la documentation Java; c'est une réponse simple à la question spécifique posée ci-dessus - c'est-à-dire, la trimméthode supprime-t-elle un seul espace ou plusieurs espaces?
LukeH

Je sais que non. J'ai voté à la baisse parce qu'il ne le souligne pas, même en passant. Dans tous les cas, je ne peux pas annuler mon vote à moins qu'il ne soit mis à jour (même de manière minimale).
user2864740

33

À partir du code source (décompilé):

  public String trim()
  {
    int i = this.count;
    int j = 0;
    int k = this.offset;
    char[] arrayOfChar = this.value;
    while ((j < i) && (arrayOfChar[(k + j)] <= ' '))
      ++j;
    while ((j < i) && (arrayOfChar[(k + i - 1)] <= ' '))
      --i;
    return (((j > 0) || (i < this.count)) ? substring(j, i) : this);
  }

Les deux whileque vous pouvez voir signifient que tous les caractères dont l'unicode est en dessous du caractère espace, au début et à la fin, sont supprimés.


27

En cas de doute, rédigez un test unitaire:

@Test
public void trimRemoveAllBlanks(){
    assertThat("    content   ".trim(), is("content"));
}

NB : bien entendu le test (pour JUnit + Hamcrest) n'échoue pas


43
Demandez à un nouveau programmeur qui vient d'apprendre à faire un System.out.println de faire un test unitaire pour voir quel est le résultat ...
jaxkodex

26

Une chose à souligner, cependant, est que String.trim a une définition particulière de "espace blanc". Il ne supprime pas les espaces Unicode, mais supprime également les caractères de contrôle ASCII que vous ne pouvez pas considérer comme des espaces.

Cette méthode peut être utilisée pour couper les espaces du début et de la fin d'une chaîne; en fait, il supprime également tous les caractères de contrôle ASCII.

Si possible, vous voudrez peut-être utiliser StringUtils.strip () de Commons Lang, qui gère également les espaces Unicode (et est également sûr pour les valeurs nulles).


3
Cela ressemble à un terrible oubli de la part des concepteurs ... et le travail terriblement trop technique de la documentation n'aide pas beaucoup.
user2864740

2
Bravo! Vous avez répondu à la question la plus simple jamais posée sur StackOverflow et avez trouvé quelque chose d'intelligent à dire à ce sujet. Vous faites honneur à la course.
Mark McKenna

3
@MarkMcKenna: Je n'arrête pas de constater que ces questions de programmation soi-disant super simples (couper les chaînes, trouver des extensions de nom de fichier, etc.) ont toujours leurs complexités cachées. C'est un peu décevant sur notre métier et nos outils.
Thilo

15

Voir API pour la classe String:

Renvoie une copie de la chaîne, en omettant les espaces de début et de fin.

Les espaces blancs des deux côtés sont supprimés:

Notez que trim()ne modifie pas l'instance String, elle renverra un nouvel objet:

 String original = "  content  ";
 String withoutWhitespace = original.trim();

 // original still refers to "  content  "
 // and withoutWhitespace refers to "content"

1
en fait, rien ne peut changer l'instance String (à l'exception de certaines choses sales qui pourraient faire planter la machine virtuelle)
AvrDragon

13

Basé sur la documentation Java ici , le .trim()remplace '\ u0020' qui est communément appelé espace blanc.

Mais notez que le '\ u00A0' ( Unicode NO-BREAK SPACE &nbsp; ) est également considéré comme un espace blanc et .trim()ne le supprimera PAS. Ceci est particulièrement courant en HTML.

Pour le supprimer, j'utilise:

tmpTrimStr = tmpTrimStr.replaceAll("\\u00A0", "");

Un exemple de ce problème a été discuté ici .


Basé sur le Javadoc, il supprime les espaces blancs de début et de fin, qui incluent l'espace, la tabulation, le retour chariot de retour à la ligne, le saut de page, ... et qui exclut les caractères qui ne sont ni de début ni de fin.
Marquis de Lorne

Merci, ça m'aide à allouer
Asad Haider

8

Exemple de trim()suppression d'espaces Java :

public class Test
{
    public static void main(String[] args)
    {
        String str = "\n\t This is be trimmed.\n\n";

        String newStr = str.trim();     //removes newlines, tabs and spaces.

        System.out.println("old = " + str);
        System.out.println("new = " + newStr);
    }
}

PRODUCTION

old = 
 This is a String.


new = This is a String.

4

À partir de la documentation java (source de la classe String),

/**
 * Returns a copy of the string, with leading and trailing whitespace
 * omitted.
 * <p>
 * If this <code>String</code> object represents an empty character
 * sequence, or the first and last characters of character sequence
 * represented by this <code>String</code> object both have codes
 * greater than <code>'&#92;u0020'</code> (the space character), then a
 * reference to this <code>String</code> object is returned.
 * <p>
 * Otherwise, if there is no character with a code greater than
 * <code>'&#92;u0020'</code> in the string, then a new
 * <code>String</code> object representing an empty string is created
 * and returned.
 * <p>
 * Otherwise, let <i>k</i> be the index of the first character in the
 * string whose code is greater than <code>'&#92;u0020'</code>, and let
 * <i>m</i> be the index of the last character in the string whose code
 * is greater than <code>'&#92;u0020'</code>. A new <code>String</code>
 * object is created, representing the substring of this string that
 * begins with the character at index <i>k</i> and ends with the
 * character at index <i>m</i>-that is, the result of
 * <code>this.substring(<i>k</i>,&nbsp;<i>m</i>+1)</code>.
 * <p>
 * This method may be used to trim whitespace (as defined above) from
 * the beginning and end of a string.
 *
 * @return  A copy of this string with leading and trailing white
 *          space removed, or this string if it has no leading or
 *          trailing white space.
 */
public String trim() {
int len = count;
int st = 0;
int off = offset;      /* avoid getfield opcode */
char[] val = value;    /* avoid getfield opcode */

while ((st < len) && (val[off + st] <= ' ')) {
    st++;
}
while ((st < len) && (val[off + len - 1] <= ' ')) {
    len--;
}
return ((st > 0) || (len < count)) ? substring(st, len) : this;
}

Notez qu'après avoir obtenu le début et la longueur, il appelle la méthode substring de la classe String.


Où "espace blanc" est "caractères avec des valeurs inférieures ou égales à \ x20" .. brillant.
user2864740

3

trim()supprimera tous les blancs de début et de fin. Mais attention: votre chaîne n'est pas modifiée. trim()renverra une nouvelle instance de chaîne à la place.


Cela supprimera tous les espaces de
Marquis of Lorne

3

Si votre entrée String est:

String a = "   abc   ";
System.out.println(a);

Oui, la sortie sera, "abc"; Mais si votre entrée String est:

String b = "    This  is  a  test  "
System.out.println(b);

La sortie sera This is a test donc Trim supprime uniquement les espaces avant votre premier caractère et après votre dernier caractère dans la chaîne et ignore les espaces intérieurs. Ceci est un morceau de mon code qui optimise légèrement la Stringméthode de découpage intégrée en supprimant les espaces intérieurs et en supprimant les espaces avant et après votre premier et dernier caractère de la chaîne. J'espère que ça aide.

public static String trim(char [] input){
    char [] output = new char [input.length];
    int j=0;
    int jj=0;
    if(input[0] == ' ' )    {
        while(input[jj] == ' ') 
            jj++;       
    }
    for(int i=jj; i<input.length; i++){
      if(input[i] !=' ' || ( i==(input.length-1) && input[input.length-1] == ' ')){
        output[j]=input[i];
        j++;
      }
      else if (input[i+1]!=' '){
        output[j]=' ';
        j++;
      }      
    }
    char [] m = new char [j];
    int a=0;
    for(int i=0; i<m.length; i++){
      m[i]=output[a];
      a++;
    }
    return new String (m);
  }

Les premières déclarations de cette réponse sont totalement fausses, la sortie ne sera pas "abc". Peut-être avez-vous oublié .trim()dans le System.out.println(a);?
Arjan

2

Cela supprimera tous les espaces des deux côtés.


2

Une chose très importante est qu'une chaîne composée entièrement d '"espaces blancs" renverra une chaîne vide.

si a string sSomething = "xxxxx", où xreprésentent les espaces blancs, sSomething.trim()renverra une chaîne vide.

si a string sSomething = "xxAxx", où xreprésentent les espaces blancs, sSomething.trim()retournera A.

si sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()retournera SomethingxxxxAndSomethingxElse, notez que le nombre de xmots entre les mots n'est pas modifié.

Si vous voulez une chaîne en paquets soignée, combinez-la trim()avec regex comme indiqué dans cet article: Comment supprimer les espaces blancs en double dans la chaîne en utilisant Java? .

L'ordre n'a pas de sens pour le résultat mais d' trim()abord serait plus efficace. J'espère que ça aide.


2

Pour ne conserver qu'une seule instance de la chaîne, vous pouvez utiliser ce qui suit.

str = "  Hello   ";

ou

str = str.trim();

Ensuite, la valeur de la strchaîne serastr = "Hello"



0

Javadoc for String a tous les détails. Supprime les espaces blancs (espace, tabulations, etc.) des deux extrémités et renvoie une nouvelle chaîne.


0

Si vous voulez vérifier ce que fera une méthode, vous pouvez utiliser BeanShell . C'est un langage de script conçu pour être le plus proche possible de Java. D'une manière générale, il est interprété en Java avec quelques relaxations. Une autre option de ce type est le langage Groovy . Ces deux langages de script fournissent une connaissance pratique des boucles Read-Eval-Print à partir des langages interprétés. Vous pouvez donc exécuter la console et taper simplement:

"     content     ".trim();

Vous verrez "content"comme résultat après avoir appuyé sur Enter(ou Ctrl+Rdans la console Groovy).


6
Donc, pour comprendre une méthode en Java, il devrait aller apprendre un langage entièrement nouveau. Vraiment?
james.garriss

0
String formattedStr=unformattedStr;
formattedStr=formattedStr.trim().replaceAll("\\s+", " ");

Ce n'est pas lié à la question.
Mark McKenna

2
@Mark mais accidentellement c'est ce que je cherchais quand j'ai ouvert cette question ...
Armfoot

C'est également inutile. trim()fait déjà ce repkaceAll()qu'il ferait, s'il lui restait quelque chose à faire.
Marquis of Lorne

@EJP the replaceAll remplacerait également les espaces dans la chaîne par un seul espace, tandis que trim ne gérerait que les espaces de début et de fin
Krishna
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.