«Ajude, não consigo dividir uma string!» — a história de um problema
\n\nImagine: você está escrevendo em Java um parser de logs, processando um arquivo CSV ou apenas querendo dividir uma entrada do usuário em palavras. E então — pára. Como fazer isso? Se você já pesquisou no Google «How do I split a string in Java», sabe que esta pergunta no Stack Overflow acumulou centenas de milhares de visualizações. Não porque os programadores Java são preguiçosos, mas porque split() é algo poderoso, mas com armadilhas.
\n\nNeste artigo, vamos abordar a divisão de strings em Java do início ao fim. Você aprenderá como o método split() funciona, quais surpresas as expressões regulares reservam e como não pisar nos mesmos erros que esperam por cada segundo iniciante. Vamos nessa!
Método split(): sua principal ferramenta
\n\nA classe String em Java oferece duas variantes sobrecarregadas do método split():
public String[] split(String regex)\npublic String[] split(String regex, int limit)\n\nA primeira variante aceita uma expressão regular e retorna um array de strings. A segunda — a mesma coisa, mas com um limite no número de partes. Parece simples? Vamos ver exemplos.
\n\nExemplo básico: divisão por espaço
\n\npublic class SplitExample {\n public static void main(String[] args) {\n String text = "Java divide strings facilmente";\n String[] words = text.split(" ");\n \n for (String word : words) {\n System.out.println(word);\n }\n }\n}\n\nSaída:
\nJava\ndivide\nstrings\nfacilmente\n\nFunciona? Funciona. Mas e se você tiver vários espaços seguidos? Então, strings vazias vão parar no array. Desagradável, não é?
\n\nDividindo uma string em Java por vírgula (CSV)
\n\nUma das tarefas mais comuns é dividir uma string em Java por vírgula. Suponha que você tenha uma string CSV:
\n\nString csv = "maçã,pêra,banana,laranja";\nString[] fruits = csv.split(",");\n\nfor (String fruit : fruits) {\n System.out.println(fruit.trim()); // trim() remove espaços extras\n}\n\nSaída:
\nmaçã\npêra\nbanana\nlaranja\n\nObserve: adicionamos trim(), porque em dados reais, após a vírgula, muitas vezes vêm espaços. Sem isso, você obterá " maçã" com um espaço à esquerda — e depois ficará se perguntando por que as strings não coincidem.
Expressões regulares: magia e dor
\n\nO método split() aceita uma expressão regular. Isso oferece uma enorme flexibilidade, mas exige cuidado. Vamos considerar cenários populares.
Divisão por ponto
\n\nQuer dividir um endereço IP "192.168.1.1"? O código ingênuo str.split(".") não funcionará. Por quê? Porque o ponto em expressões regulares é um caractere especial, significando «qualquer caractere». Como resultado, você obterá um array de strings vazias.
A solução correta é escapar o ponto:
\n\nString ip = "192.168.1.1";\nString[] parts = ip.split("\\\\."); // Barra invertida dupla!\n\nfor (String part : parts) {\n System.out.println(part);\n}\n// Saída: 192 168 1 1\n\nLembre-se: em Java, para escapar em expressões regulares, usa-se barra invertida dupla \\\\. Uma barra simples \\ é um caractere de controle para a string, e a dupla já é para o regex.
Divisão por vários delimitadores
\n\nO que fazer se a string contiver vírgulas, ponto e vírgula e espaços? Use uma classe de caracteres entre colchetes:
\n\nString messy = "maçã;pêra,banana laranja";\nString[] items = messy.split("[;,\\\\s]+"); // ; ou , ou caracteres de espaço\n\nfor (String item : items) {\n System.out.println(item);\n}\n// Saída: maçã pêra banana laranja\n\nO sinal + significa «um ou mais» — isso garante que uma sequência de delimitadores não crie