Como separar palavras de String em Java

Como separar palavras de String em Java

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; [email protected]; 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!

Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

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, [email protected], 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:

 [email protected]

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 - [email protected] - 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;[email protected];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.

Alex Felipe
Alex Felipe

Alex é instrutor e desenvolvedor e possui experiência em Java, Kotlin, Android. Criador de mais de 40 cursos, como Kotlin, Flutter, Android, persistência de dados, comunicação com Web API, personalização de telas, testes automatizados, arquitetura de Apps e Firebase. É expert em Programação Orientada a Objetos, visando sempre compartilhar as boas práticas e tendências do mercado de desenvolvimento de software. Atuou 2 anos como editor de conteúdo no blog da Alura e hoje ainda escreve artigos técnicos.

Veja outros artigos sobre Programação