Você está na página 1de 3

Usando o mtodo split() da classe String

por Miguel Jonathan DCC/IM/UFRJ (rev. novembro de 2010)

O mtodo String[] split (exprRegular) da classe String aceita como argumento uma string com uma expresso regular, que define os separadores (delimitadores) das palavras presentes no texto. A expresso tem a forma: "sep1|sep2|....|sepn" onde sepi so as substrings usadas como delimitadores de palavras, e o caractere '|' significa "ou". Uma explicao detalhada sobre expresses regulares em Java pode ser encontrada na API da classe Pattern (java.util.regex.pattern), mas esse texto introdutrio suficiente para os exerccios iniciais. Por exemplo, o texto:
"um, dois, tres, quatro cinco:so nmeros"

usa 3 substrings como separadores das palavras:


", " ":" " "

(uma vrgula seguida de um espao) (um caractere dois pontos) (um espao)

Para obter um vetor com as palavras do texto acima, fazemos:


String[] vet = texto.split(", |:| ");

(note que o argumento do mtodo uma nica string ) Neste exemplo, o vetor vet ser criado com tamanho e contedo abaixo:
"um" vet[0] "dois" vet[1] "tres" vet[2] "quatro" vet[3] "cinco" vet[4] "so" vet[5] "nmeros" vet[6]

Ateno: se o texto contiver um separador seguido de outro, ser criada uma string vazia entre os delimitadores (""). Por exemplo, se o texto for:
"um,,dois,,trs"

e se o delimitador for "," (uma vrgula apenas), ser criada no vetor uma string vazia aps cada palavra:
String[] vet = "um,,dois,,trs".split(",")

O vetor vet ficar com o contedo abaixo:


"um" vet[0] "" vet[1] "dois" vet[2] "" vet[3] "trs" vet[4]

Metacaracteres As expresses regulares usam caracteres como "|" nos exemplos acima, para descrever o sentido da expresso. Eles so chamados de metacaracteres. Alguns metacaracteres so:
| * ? \ . + - [ ] ^ ( ) { }

Significado: | separa alternativas ("ou"): ("xx|yy|zz") inclui "xx", "yy" e "zz" * zero ou mais vezes o caractere anterior: "1a*2" inclui "12" "1a2" "1aaaa2"

? zero ou uma vez apenas o caractere anterior: "Joh?n" inclui Jon e John

\ caractere de escape ver adiante, caracteres especiais. + uma ou mais vezes o caractere anterior: "1a+2" inclui "1a2" "1aaaaa2", mas no "12" . qualquer caractere: "xx.zz" inclui "xx3zz" "xxyzz" "xxHzz" "xx?zz"
[inicio-fim]: sub-conjunto de caracteres ASCII: "[b-h][X-Z][0-9]"

inclui "bX1" "dY2" e

"fZ5"
[sequencia]: qualquer caractere da sequencia: "x[aeiou]" inclui "xa", "xe", etc.

^ excluso: "a[^0-9]b" inclui "axb" "adb" "a/b", mas no "a2b"

"a5b"

( ): parnteses podem agrupar alternativas: "(a|x|z)[1-3]" inclui a1, x1, z1, a2, x2, z2, a3,

x3 e z3 Caso se queira que um delimitador inclua um dos metacaracteres, este deve ser precedido por uma barra invertida de escape (\). Dentro de uma string literal entre aspas, deve ser precedido de duas barras invertidas. Por exemplo, se os separadores forem um ponto ou um ou mais asteriscos, a expresso regular seria:
"\\.|\\*+"

Exemplo: abc.cde***fgh.klm*ppp".split("\\.|\\*+"); Retorna um vetor contendo strings: Caracteres especiais: So precedidos por uma barra transversa, chamada "barra de escape", e tm significados especiais nas expresses regulares:
\d = um dgito \D = um "no dgito" \s = um "branco", que pode ser espao, tab, new line, form feed, end of line, ou carriage return. \S = qualquer caractere que no um "branco" \w = uma letra, dgito ou sublinhado \W = qualquer caractere que no uma letra, dgito ou sublinhado. "abc", "cde", "fgh", "klm", "ppp"

OBS: Dentro de uma string, a barra deve ser duplicada: Exemplos:


"a\\dx" inclui "a5x" "a7x" "a\\Dx" inclui "abx" "a:x", mas no "a5x" "[a-z]\\w*" inclui qualquer palavra que comea com letra minscula, seguida por zero ou

mais letras, dgitos ou underscores.


Importncia da ordem em que os padres aparecem na expresso regular:

Quando uma expresso regular tem alternativas (com o uso da barra vertical | ), os padres alternativos so tentativamente aplicados string da esquerda para a direita. O primeiro que casar ser aplicado. Por isso, em alguns casos, importante escolher a ordem em que esses padres so escritos na expresso regular. Por exemplo, suponha que o separador possa ser um dois-pontos (:) ou qualquer sequencia de dgitos opcionalmente antecedida por um dois-pontos, como em:

String s = "aaa:bbb:22ccccc123ddd";

Se aplicarmos: s.split(":|:?[0-9]+"); primeiro um nico dois-pontos ser procurado, e se for encontrado ser o separador, e s se no for encontrado ser tentado o segundo padro. Nesse caso, depois de bbb, o trecho :22 ser entendido como o separador : seguido do separador 22, com uma string vazia no meio. Mas se invertermos a ordem, e aplicarmos: s.split(":?[0-9]+|:"); primeiro ser tentado aplicar o padro dois-pontos opcional seguido de sequencia de digitos e s se no casar, ser tentado o padro um dois-pontos nico. Nesse caso, depois de bbb o trecho :22 ser casado a um separador, sem string vazia no meio.
Uso da barra transversa como separador:

No aconselhvel, mas, se quiser, ter que colocar duas barras na expresso da string, e quatro barras na expresso do separador! Por exemplo:
String s = "abc\\def\\ghij"; String[] v = s.split("\\\\"); //retorna vetor com "abc", "def" e "ghij"

Uso combinado dos diversos recursos:

Podemos combinar todos os recursos acima descritos para formar expresses. Por exemplo:
"[0-9]+"

reconhece qualquer combinao de um ou mais dgitos numricos: 121, 3334, 5, 0453,

etc. reconhece qualquer sequncia de um ou mais brancos, ponto e vrgula. Portanto, palavras podem ser separadas por ponto seguido ou antecedido por qualquer nmero de espaos, quebras de linha, etc, ou por vrgulas antecedidas ou seguidas por brancos, etc.
"[\\s\\.,]+"

Você também pode gostar