Introdução a Expressões Regulares com Java
[b]Introdução a Expressões Regulares com Java[/b]
Por Tadeu R. A. Santos
A partir da versão 1.4 do J2SE, Java conta com um bom suporte a expressões
regulares. Este tutorial tenta servir de introdução a este conceito com aplicação
Java.
1. O que são expressões regulares?
Trata-se de um método formal para se especificar um padrão de texto.
O uso de expressões regulares na computação é abundante e praticamente
pré-histórico. Isto se deve pela facilidade de se fazer comparações, a fim de achar
uma dada palavra (ou parte dela) em um texto.
2. Aplicações
Quando, em um SO de modo texto, deseja-se listar todos os arquivos começados por J
em um determinado diretório, basta fazer:
Neste caso, o uso do caractere * dá-se de forma especial, significando "qualquer
cadeia de caractere (String)". Assim serão mostrados arquivos como:
Entre outros começados com J.
Chamamos J*, então, de expressão regular.
Como esse exemplo, existem centenas de aplicações onde as expressões regulares
poupam um bom trabalho na implementação.
Para fim de exemplo didático, será mostrado um código simples para validar endereços
de email (hello world das expressões regulares :D).
[b]3. Gramática das Expressões Regulares[/b]
Antes do exemplo, porém, seria de bom tom o conhecimento dos caracteres especiais
usados em expressões regulares. Apesar de ser um assunto extenso, será abordado
somente alguns dos caracteres especiais mais usados e aceitos pela API do Java, a
saber: [\^]?*+-.
*
Qualquer cadeia de caractere.
Expressão Regular: J*Free // Qualquer coisa que comece com J e termine com Free
String comparada: JavaFree
String válida: sim
String comparada: JavaPago
String válida: não
[ ]
Um dos elementos do conjunto
Expressão Regular: [rgp]ato // Qualquer palavra com a primeira letra sendo ou 'r' ou
'g' ou 'p', e as letras seguintes sendo "ato"
String comparada: pato
String válida: sim
String comparada: gato
String válida: sim
String comparada: xato
String válida: não
^
Exclusão
Expressão Regular: [^rgp]ato // Qualquer palavra cuja primeira letra NÃO é 'r' nem
'g' nem 'p', sendo "ato" o resto da palavra
String comparada: rato
String válida: não
String comparada: xato
String válida: sim
-
Intervalo
Expressão Regular: [H-L]avaFree // A primeira letra da palavra deve está entre H e L
(inclusive H e L)
String comparada: JavaFree
String válida: sim
String comparada: RavaFree
String válida: não
.
Qualquer caractere
Expressão Regular: JavaFre.
String comparada: JavaFree
String válida: sim
Classe de caracteres pré-definidos. São eles:
Expressão regular: \wJavaFree\s200\d\w
String comparada: _JavaFree 2004_
String válida: sim
?
Uma ou nenhuma vez, assim como '*', '?' é um elemento [i]quantificador[/i].
Expressão regular: a? // Uma ou nenhuma ocorrência de 'a'
String comparada:
String válida: sim
String comparada: a
String válida: sim
+
Uma ou mais vezes, assim como '*' e '?', é um elemento [i]quantificador[i].
Expressão regular: a+ // Uma ou mais ocorrências de 'a'
String comparada:
String válida: não
String comparada: aaa
String válida: sim
Pode-se ainda combinar todos esses caracteres especiais em uma só expressão regular,
formando uma busca mais restringente.
[b]4. Java API[/b]
Java dispõe de mecanismos muito bons para o tratamento de expressões regulares no
pacote java.util.regex . Para um melhor aproveitamento, é aconselhável o estudo da
documentação deste pacote disponível em:
[url]http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/package-summary.html[/url]
Um objeto da classe Pattern contém a expressão regular desejada que será usada em
uma comparação. Já um objeto da classe Matcher contém os métodos que validarão nossa
String, dada uma expressão regular.
Ex.:
O exemplo acima poderia, ainda, ser feito somente com o uso do método [b]boolean
matches(String regex, CharSequence entrada)[/b] da classe Pattern, da seguinte
forma:
Estes exemplos mostram que é bem fácil trabalhar com expressões regulares em Java.
5. Exemplo: Validar um Endereço de Email
Fica bem simples, agora, validar um endereço de email (ou outro dado qualquer).
Vale sempre estudar a documentação das classes. O exemplo dado aqui é bem trivial,
exitem mais métodos com outras funcionalidade muito boas no pacote.
6. Referências
[1] Sun Microsystems Inc, The Java[tm] Tutorial Lesson: Regular Expressions
[url]java.sun.com/docs/books/tutorial[/url]
[2] JARGAS, Aurélio Marinho, EXPRESSÕES REGULARES
[url]guia-er.sourceforge.net/guia-er.html#toc1[/url], 25 abr, 2003]
[3] SHAH, Hetal C. , Regular Expressions in J2SE [onjava.com, 26 nov, 2003]
Até o próximo,
Tadeu R. A. Santos
ls J* (unix like) ou dir J* (dos)
Java.txt; JavaFree.rox; JavaDetona.net;
\d : Um dígito, \D : Algo que não seja um dígito, \s : Um espaço em branco, \S : Algo que não seja um espaço em branco, \w : Qualquer letra, dígito ou underscore ( _ ) \W : Algo que não seja letra, dígito ou underscore
Pattern padrao = Pattern.compile("Java*");
Matcher pesquisa = padrao.matcher("JavaFree");
if (pesquisa.matches())
{
System.out.println("JavaFree Rox");
}
else
{
System.out.println("Hum..?");
}
if (Pattern.matches("Java*", "JavaFree"))
{
System.out.println("JavaFree Rox");
}
else
{
System.out.println("Hum..?");
}
/* Exemplo prático
*
* Verifica se um endereço de email é válido
*
* Compilar: javac ValidarEmail.java
* Executar: java ValidarEmail teste@meuemail.com
*/
// --------------------------------------------------------------- classes nativas
import java.util.regex.*;
// --------------------------------------------------------------- nossa classe
class ValidarEmail
{
public static void main (String[] args)
{
if (args.length < 1) // Falta argumentos de execução
{
System.out.println("Uso: java ValidarEmail <seu@email.com>");
}
else
{
// Email válido é na forma usario@endereco.com , usario@endereco.com.br, etc.
// Tente fazer um expressão mais restringente :D
Pattern padrao = Pattern.compile(".+@.+\\.[a-z]+");
Matcher pesquisa = padrao.matcher(args[0]);
if (pesquisa.matches())
{
System.out.println("O email " + args[0] + " eh valido!");
}
else
{
System.out.println("O email " + args[0] + " nao eh valido!");
}
}
}//end main()
}//ValidarEmail.class
Tadeu Santos
Curtidas 0
Respostas
Kayser
09/04/2009
Muito bom esse tutorial. Parabéns!
Estou com o seguinte problema: preciso identificar o caracter (ponto) em uma expressão regular. Como faço?
Como o ponto é um caracter especial, ele é entendido como "qualquer caracter"...
GOSTEI 0
Marcio Panaroni
09/04/2009
Utiliza o caractere de escape "\" (contra-barra, sem as aspas). Veja no exemplo de como verificar um e-mail. E vale muito a pena verificar a página do [url=http://guia-er.sourceforge.net/guia-er.html]Aurélio Marinho Jargas[/url], que consta na bibliografia... :mrgreen:
GOSTEI 0
Puri
09/04/2009
Olá.
Eu preciso fazer uma expressão regular para reconhecer o seguinte:
@medico
Mas não pode ser case sensitive.
Alguma idéia de como fazê-lo?
GOSTEI 0
Carlos Heuberger
09/04/2009
Oi,
se realmente precisa da expressao regular:
[b]@[mM][eE][dD][iI][cC][oO][/b]
outra opcao seria usar o String.toLowerCase() antes de comparar com "@medico"
[]]]
GOSTEI 0
Puri
09/04/2009
Muito obrigado cara!
Funcionou perfeitamente!
Valew!
GOSTEI 0
Julivan Silva
09/04/2009
[b][i]
Alguém poderia me ajudar?
Preciso de uma expressão regular para destrinchar uma string que será passada com três valores, separados apenas por ;.
têm alguma regra especial para o ";"???
o contexto é o seguinte, o usuário envia a opção desejada através do número e mais dois parâmetros que serão calculados em uma classe remota.
por exemplo:
public class TesteExpressoesRegulares {
public static void main(String[] args) {
String [] dados = null;
String origem = "1;valor1;valor2";
dados = origem.split("\\;");
JOptionPane.showMessageDialog(null, dados[0]);
}
}[color=blue][/color]
GOSTEI 0
Julivan Silva
09/04/2009
cara eu testei esse código e funcionou perfeitamente
eu achei estranho aquela "\\", e sem ela funciona também.
GOSTEI 0
Julivan Silva
09/04/2009
tudo bem, mas eu gostaria de saber se na hora que eu enviar
para a outra classe, seria a ServerSocket, ela irá conseguir distinguir os 3 parâmetros?
GOSTEI 0
Julivan Silva
09/04/2009
distinguir como ?
se você estiver falando da ordem dos parâmetros
não tem como, a outra classe vai receber três Strings. o que você pode fazer é convencionar uma ordem.
GOSTEI 0
Julivan Silva
09/04/2009
ótimo, como posso convencionar uma ordem então?
at++
valeu
GOSTEI 0
Julivan Silva
09/04/2009
crie os três parâmetros do método com nomes sugestivos
se você usa alguma ferramenta tipo javadoc é possível detalhar melhor
isso não impede que a ordem venha errada mais já é um começo.
GOSTEI 0
Julivan Silva
09/04/2009
valeu
obrigado mesmo.
//precisando, estamos ai.....
GOSTEI 0
Raphael Castro
09/04/2009
VLw, entendi e funcionou normal, porem nao entendi uma coisa
Pattern padrao = Pattern.compile(".+@.+\\.[a-z]+");
alguem poderia explicar passo a passo cada detalhe do parametro? pq tem o sinal de + 3 vezes? o que é \\.? enfim.. cada aprte do parametro...
GOSTEI 0
Erick Leão
09/04/2009
Fala galera eu estou com um probleminha na minha ER
eu preciso verificar quando eu tenho na string o seguinte...
[bloco de comando]
preciso recuperar o nome dentro do [] no php eu faria assim
\[(.*?)\] sendo que o \[ escapa o [ mais no java num ta rolando isso alguem pode me ajudar?
GOSTEI 0
Carlos Heuberger
09/04/2009
Näo está rolando no java, significa o que?
- Erro de compilacäo?
- Exception durante a execucäo?
- Simplesmente näo faz o que voce quer?
- Näo achou a documentacäo?
- ???
Usando a minha bola de cristal :--) vejo que esse [i]problema[/i] ou semelhante já deve ter sido respondido no Javafree.
Voce leu documentacäo do [u][url=http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html]java.util.regex.Pattern[/url][/u]? principalmente a parte "Backslashes, escapes, and quoting"
Leitura adicional: [u][url=http://twiki.dcc.ufba.br/bin/view/PSL/ComoFazerPerguntasInteligentes]Como fazer perguntas[/url][/u]
[]]]
GOSTEI 0
Alessandro
09/04/2009
Um adentro. A Revista Mundo java, nº 24 saiu uma reportagem sobre o assun to. Como meu primeiro contato, gostei bastante.
GOSTEI 0
Sofiarw4
09/04/2009
Eu não consigo.. me digam o que estou fazendo mal...
Pattern p = Pattern.compile("<td>(\\w+)</td>");
eu quero que reconheça tambem os pontos!
AjUdEm pf!!
GOSTEI 0
Junhu
09/04/2009
Caros colegas , só uma coisa se eu trouxer de um DB a validação que o campo tem que ter com ER, tende a funcionar posso comparar no java o que vem de um rs/col.
Ah! e a classe a ser usada é esta tal de Pattern.
Muito Obrigado
GOSTEI 0
João Sewaybrick
09/04/2009
Também li o livro do piazinho aquele te capa verde legal o uso.
fiz alguns lá pelo site mesmo o de RG
GOSTEI 0
João Sewaybrick
09/04/2009
[quote="RaphaelSantos"]VLw, entendi e funcionou normal, porem nao entendi uma coisa
Pattern padrao = Pattern.compile(".+@.+\\.[a-z]+");
alguem poderia explicar passo a passo cada detalhe do parametro? pq tem o sinal de + 3 vezes? o que é \\.? enfim.. cada aprte do parametro...
Então cara quer dizer o seguinte um ou mais caracteres qualquer.
Existe meta caracteres representativo o ponto(.) (representa um carácter qualquer),
lista [] representa também um carácter (Ela aceita um lista de caracteres e se casa com um deles.
uma mais restritiva seria essa:
\\.+[^ ]@\\.+[^ ]\\.com(\\.(br|edu|org))?
lista negada[^] casa com tudo que não pertencer a lista.
Bom nessa expressão o que ocorre é
um ou mais caracteres qualquer seguido de @, uma ou mais caráteres qualquer seguido de ponto e finalmente um ou mais caracteres .
o sinal de + significa um ou mais (é metacaracter do tipo quantificador)
o \ é um carácter especial que escapa todos os meta caracteres até ele mesmo.
O problema é que não sei se lista negada no java pega.
no piazinho funciona.
GOSTEI 0
João Sewaybrick
09/04/2009
Parabens !
Muito bom artigo !
Além de elucidar minhas dúvidas sobre Pattern Matchers, também aprendi como visualizar de forma elegante e precisa a identação do código Java.
class minha classe {
main void {
meu codigo
} //main void (adorei isso !!!)
}//minha clase (adorei isso !!!)
Grato !!!
Heitor Pereira
GOSTEI 0
João Sewaybrick
09/04/2009
Ola eu estou com uma Duvida! eu uso o caracter special ý tem alguma regra para esse caracter? Oque quero na verdade e pegar o numero que esta apos ele! alguem poderia me ajudar como faser isso!
Preciso pegar numero que vai tar Depois do ý e para eu efetuar uma pesquisa alguem poderia me ajudar!
File dir = new File("C:\\BancoTXT\\");
File fNomes = new File(dir+"idxNomes.txt");
String separador = "ý";
try {
FileReader fileReader = new FileReader(fNomes);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String ID = bufferedReader.readLine();
System.out.println(ID);
TfBusID.setText(ID);
TfBusID.setText(ID);
BotaoIDActionPerformed(evt);
}catch (IOException e ) {
e.getMessage();
}
GOSTEI 0