Quantos espaços Java String.trim () removerá?


117

Em Java, tenho uma String como esta:

"     content     ".

Irá String.trim()remover todos os espaços nesses lados ou apenas um espaço em cada um?


197
Para os downvoters: seu comportamento é condescendente. Esta questão é detalhada e específica, escrita de forma clara e simples, de interesse para pelo menos um outro programador em algum lugar. As pessoas podem não saber onde encontrar o javadoc ou o código-fonte. Nosso trabalho é ajudá-los, não criticá-los por serem ignorantes.
glmxndr

14
@subtenante, você está correto. Eu até já defendi as pessoas por fazerem perguntas do tipo google antes. No entanto, algo tão simples como isso deve ser testado por conta própria, e a IMO NUNCA deve garantir a postagem de uma pergunta em um site de perguntas e respostas. O título é enganoso e o Q é uma perda de tempo para todos que o lêem.
Chris

9
@Chris: oneat me deu a oportunidade de olhar o código-fonte. Aprendi muito sobre trim (). Eu não teria de outra forma. Cada um é responsável por gastar seu tempo. Oneat não deve ser responsabilizado por não sermos capazes de obter lucro com sua pergunta aparentemente ingênua.
glmxndr

1
@skaffman: (c) deve ser "experimente e veja", e só então (d) pergunte no SO.
Mac

2
Esta questão parece estar fora do tópico porque é sobre algo que qualquer um deve ser capaz de encontrar no manual E testar em menos de um minuto.
Jasper

Respostas:


168

Todos eles .

Retorna : Uma cópia desta string com espaço em branco à esquerda e à direita removidos, ou esta string se ela não tiver nenhum espaço em branco à esquerda ou à direita.

~ Citado em documentos Java 1.5.0

(Mas por que você não experimentou e viu por si mesmo?)


1
Tive que votar contra, pois esta resposta não cobre o que a documentação quer dizer com "espaço em branco". Pareceria lógico que seria onde Chararacter.isWhitespaceé verdade, mas não é isso que significa "espaço em branco" ..
user2864740

7
@ user2864740: Esta resposta não pretende ser uma análise abrangente trim, isWhiteSpaceetc, ou uma discussão sobre ambigüidades nos documentos Java; é uma resposta direta à pergunta específica feita acima - ou seja, o trimmétodo remove um ou vários espaços?
LukeH

Eu sei que não. Eu votei contra porque ele não aponta isso, mesmo de passagem. Em qualquer caso, não posso desfazer meu voto a menos que seja atualizado (mesmo que minimamente).
user2864740

33

Do código-fonte (descompilado):

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

Os dois whileque você pode ver significam que todos os caracteres cujo unicode está abaixo do caractere de espaço, no início e no final, são removidos.


27

Em caso de dúvida, escreva um teste de unidade:

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

NB : é claro que o teste (para JUnit + Hamcrest) não falha


43
Pergunte a um novo programador que acabou de aprender como fazer um System.out.println para fazer um teste de unidade para ver qual é o resultado ...
jaxkodex

26

Uma coisa a se destacar, entretanto, é que String.trim tem uma definição peculiar de "espaço em branco". Ele não remove os espaços em branco Unicode, mas também remove os caracteres de controle ASCII que você pode não considerar os espaços em branco.

Este método pode ser usado para cortar os espaços em branco do início e do final de uma string; na verdade, ele também corta todos os caracteres de controle ASCII.

Se possível, você pode usar StringUtils.strip () de Commons Lang, que também lida com espaços em branco Unicode (e também é null-safe).


3
Parece um terrível descuido da parte dos designers ... e o trabalho terrivelmente excessivamente técnico da documentação não ajuda muito.
user2864740

2
Bravo! Você pegou a pergunta mais simples já feita no StackOverflow e encontrou algo inteligente para dizer sobre ela. Você é um crédito para a corrida.
Mark McKenna

3
@MarkMcKenna: Eu continuo descobrindo que essas questões de programação supostamente super-simples (aparar strings, encontrar extensões de nome de arquivo, etc.) sempre têm suas complexidades ocultas. Isso é um pouco desiludido em relação à nossa arte e ferramentas.
Thilo de

15

Consulte API para a classe String:

Retorna uma cópia da string, com espaços em branco à esquerda e à direita omitidos.

Espaços em branco em ambos os lados são removidos:

Observe que trim()não altera a instância de String, ela retornará um novo objeto:

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

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

1
na verdade, nada pode alterar a instância de String (exceto algumas coisas sujas que podem travar a VM)
AvrDragon

13

Com base nos documentos Java aqui , o .trim()substitui '\ u0020' que é comumente conhecido como espaço em branco.

Mas preste atenção, o '\ u00A0' ( Unicode NO-BREAK SPACE &nbsp; ) também é visto como um espaço em branco e .trim()NÃO o removerá. Isso é especialmente comum em HTML.

Para removê-lo, eu uso:

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

Um exemplo desse problema foi discutido aqui .


Com base no Javadoc, ele remove os espaços em branco à esquerda e à direita, que incluem espaço, tab, retorno de carro de nova linha, alimentação de formulário, ... e que exclui caracteres que não estão à esquerda ou à direita.
Marquês de Lorne

Obrigado, isso me ajuda a distribuir
Asad Haider,

8

Exemplo de trim()remoção de espaços de 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);
    }
}

RESULTADO

old = 
 This is a String.


new = This is a String.

4

De documentos java (fonte da 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;
}

Observe que, depois de obter o início e o comprimento, ele chama o método substring da classe String.


Onde "espaço em branco" é "caracteres com valores menores ou iguais a \ x20" .. brilhante.
user2864740

3

trim()irá remover todos os espaços em branco à esquerda e à direita. Mas esteja ciente: sua string não foi alterada. trim()irá retornar uma nova instância de string.


Isso removerá todos os espaços em branco
Marquês de Lorne

3

Se a sua entrada String for:

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

Sim, a saída será, "abc"; Mas se sua entrada String for:

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

A saída será This is a test So trim apenas remove os espaços antes do seu primeiro caractere e depois do seu último caractere na string e ignora os espaços internos. Este é um trecho do meu código que otimiza ligeiramente o Stringmétodo interno de corte removendo os espaços internos e remove os espaços antes e depois de seu primeiro e último caractere na string. Espero que ajude.

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

As primeiras duas afirmações nesta resposta estão completamente erradas, a saída não será "abc". Talvez você tenha esquecido .trim()no System.out.println(a);?
Arjan

2

Isso removerá todos os espaços em ambos os lados.


2

Uma coisa muito importante é que uma string feita inteiramente de "espaços em branco" retornará uma string vazia.

se a string sSomething = "xxxxx", onde xsignifica espaços em branco, sSomething.trim()retornará uma string vazia.

se a string sSomething = "xxAxx", onde xficar por espaços em branco, sSomething.trim()retornará A.

se sSomething ="xxSomethingxxxxAndSomethingxElsexxx", sSomething.trim()voltará SomethingxxxxAndSomethingxElse, observe que o número xentre as palavras não é alterado.

Se você quiser uma string empacotada limpa, combine trim()com regex como mostrado neste post: Como remover espaços em branco duplicados em uma string usando Java? .

A ordem não faz sentido para o resultado, mas trim()primeiro seria mais eficiente. Espero que ajude.


2

Para manter apenas uma instância da String, você pode usar o seguinte.

str = "  Hello   ";

ou

str = str.trim();

Então, o valor da strString, serástr = "Hello"



0

Javadoc for String contém todos os detalhes. Remove o espaço em branco (espaço, tabulações, etc.) de ambas as extremidades e retorna uma nova string.


0

Se você quiser verificar o que algum método fará, você pode usar o BeanShell . É uma linguagem de script projetada para ser o mais próximo possível do Java. De modo geral, é interpretado Java com alguns relaxamentos. Outra opção desse tipo é a linguagem Groovy . Ambas as linguagens de script fornecem um loop Read-Eval-Print conveniente conhecido por linguagens interpretadas. Então você pode executar o console e apenas digitar:

"     content     ".trim();

Você verá o "content"resultado após pressionar Enter(ou Ctrl+Rno console do Groovy).


6
Portanto, para entender um método em Java, ele deve aprender uma linguagem inteiramente nova. Realmente?
james.garriss

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

Isso não está relacionado à pergunta.
Mark McKenna

2
@Mark mas acidentalmente era o que eu procurava quando abri esta pergunta ...
Armfoot

Também é inútil. trim()já faz o repkaceAll()que faria, se sobrasse alguma coisa para ele fazer.
Marquês de Lorne

@EJP, o replaceAll também substituiria os espaços em branco IN na string por um único espaço, enquanto o trim só lidaria com espaços à esquerda e à direita
Krishna
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.