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