Como separar palavras de String em Java

(Última atualização em: 10 de julho de 2017)

Fiz a leitura de um arquivo CSV com as informações de nome, e-mail e pontos de um aluno. Essas informações estão dentro de uma única String:

String alunoRecebido = "Alex; alex.vieira@caelum.com.br; 15000";

Agora preciso enviar essas informações para ele:

Aluno aluno = new Aluno();
aluno.setNome (/* não posso passar a string inteira!!! */); 

Pegando um pedaço da String

E agora? Como eu posso pegar um pedaço dessa String e settar no meu aluno?
Podemos usar o método da substring(), da classe String, que pega um pedaço dela por meio de 2 parâmetros:

aluno.setNome(alunoRecebido.substring(0, 4));

System.out.println(aluno.getNome());

Testando o código:

Alex

Ótimo, funcionou!

O método substring() pegou justamente o nome do aluno Alex, pois o nome Alex inicia no começo (posição 0) e termina no 4º caractere dessa String, ou seja, para pegar o e-mail eu terei que usar o substring() de novo. Então, vamos verificar qual posição o e-mail está…

O começo é 6, agora o final… 7, 8, 9, 10, 11, 12, 15, 17, 20… Perdi a conta! Que chato! Todas as vezes eu vou precisar ficar contando a dedo a posição do texto?

E se o aluno fosse o Guilherme? Ele não terminaria na 4º posição… Com certeza isso vai dar um problema gigante!

Separando palavras com o split

Além do método substring() a classe String possui o método split() que separa o texto em linhas de acordo com uma regra, por exemplo, quero que meu texto seja separado cada vez que aparecer um “;”:

String[] textoSeparado = alunoRecebido.split(";");

System.out.println(Arrays.toString(textoSeparado));

Visualizando o array:

[Alex,  alex.vieira@caelum.com.br,  15000]

Conseguimos separar as informações do aluno! Note que o split() devolveu um array de String, isso acontece pois ele separa cada linha em Strings diferentes, por essa razão é devolvido o array de String. Agora podemos atribuir cada valor ao meu objeto aluno:

aluno.setNome(textoSeparado[0]);
aluno.setEmail(textoSeparado[1]);
aluno.setPontos(Integer.parseInt(textoSeparado[2]));

System.out.println(aluno.getNome() + " - " + aluno.getEmail() + " - "
				+ aluno.getPontos());

Verificando as informações do aluno:

Exception in thread "main" java.lang.NumberFormatException: For input string: " 15000"

Cuidados ao usar o split

Parece que a nossa conversão para int não deu certo… Apareceu a exception pois em nossa String temos um espaço (backspace) entre o “;” e as informações, ou seja, em vez de receber apenas o número, foi recebido o espaço junto com o número, por isso não foi possível converter. Se imprimíssemos apenas o e-mail ele também viria com o espaço:

System.out.println(aluno.getEmail());

Imprimindo o email apenas:

 alex.vieira@caelum.com.br

Aplicando expressão regular no split

Precisamos informar o split() para que ele tire os espaços também. O split() trabalha em cima de expressão regular, ou seja, podemos especificar as regras utilizando expressão regular. Nesse caso eu irei usar a expressão “\s” que significa espaço em branco:

String[] textoSeparado = alunoRecebido.split(";\\s");

//setters

System.out.println(aluno.getNome() + " - " + aluno.getEmail() + " - "
				+ aluno.getPontos());

Rodando o código novamente:

Alex - alex.vieira@caelum.com.br - 15000

Funcionou! Porém tem um pequeno detalhe…a expressão regular “;\s” significa que vai ser sempre que tiver “;” e um espaço juntos, ou seja, se a String fosse:

String alunoRecebido = "Alex;alex.vieira@caelum.com.br;15000";
String[] textoSeparado = alunoRecebido.split(";\\s");
System.out.println(Arrays.toString(textoSeparado));

O resultado seria:

[Alex;alex.vieira@caelum.com.br;15000]

Com certeza meu sistema quebraria…

Adicionando mais de uma regra com pipe

Para fazer com que o split lide tanto com o caso do “;” ou “;\s” utilizamos o pipe (|):

String[] textoSeparado = alunoRecebido.split(";|;\\s");

Testando novamente aquela mesma String:

[Alex, alex.vieira@caelum.com.br, 15000]

Excelente!

Agora conseguimos pegar todas as informações do aluno que vieram da String. É importante verificar que foram utilizadas duas “\”, pois é necessário “escapar” a barra para ser reconhecida dentro da String.

Vimos que quando precisamos separar textos em Java, nós temos o método split() da classe String que tem a capacidade de separar o texto em linhas de acordo com uma regra. No nosso exemplo foi separado em todas as vezes que apareciam “;” ou quando apareciam “;” e espaços juntos. Poderia também ser uma “,” ou “:”.

O importante é saber que o split() funciona em cima de expressão regular, então qualquer uma delas se aplica.

O que achou dessa dica? Bacana, né? A gente fala bastante sobre manipulação de Strings nos cursos de Java aqui na Alura, dê uma olhada. Além disso, há também o nosso curso presencial de Java e Orientação a Objetos na Caelum, onde temos uma aula inteira dedicada ao assunto.

Content Editor at Alura and Software Developer

  • Luiz Felipe

    Ótimo artigo, já sabia da existência do método split mas não sabia que era possível utilizalo com expressões regulares para especificar as regras!

    • Obrigado Luis Felipe! Com as expressões regulares podemos fazer regras bem poderosas!

      Abraços.

  • Anne Graziely

    Ajudou bastante!

    • Alex Felipe

      Opa Anne Graziely, que bom que gostou! 🙂

      []s

Próximo ArtigoSQL pirando ao somar Doubles