Artigos de Tecnologia e Negócios > Programação

Como separar palavras de String em Java

Alex Felipe
Alex Felipe

Imagem de destaque #cover

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!

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, 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.

Artigos de Tecnologia e Negócios > Programação