Você está na página 1de 22

Uma expresso regular (ER) um mtodo formal de se especificar um padro de texto, simplificando um pouco mais, as expresses regulares so strings

s especialmente formatadas, usadas para localizar padres no texto, e podem ser teis durante a validao informaes, para que os dados estejam em um formato especfico.

Nesse artigo voc aprender a utilizar e criar expresses regulares no AspNet C#. Tambm tomar conhecimento do significado de cada expresso, bem como o conjunto de caracteres usado na elaborao de uma expresso regular. Espero vocs no prximo artigo. Boa leitura a todos e at a prxima.

Requisitos Necessrios

Para uma melhor compreenso do artigo indispensvel que o leitor tenha conhecimento AspNet C#. Alm disso disso algumas ferramentas so necessrias.

Visual Studio 2005/2008 ou Visual Web Developer 2005/2008.

Conceitos Bsicos A maioria dos formalismos provm pelo menos trs operaes para construir expresses regulares. (WIKIPEDIA) A primeira delas a alternncia, em que uma barra vertical (|) separa alternativas. Por exemplo, psicadlico|psicodlico pode casar "psicadlico" ou "psicodlico". A segunda operao o agrupamento, em que parnteses ((, )) so usados para definir o escopo e a precedncia de operadores, entre outros usos. Por exemplo, psicadlico|psicodlico e psic(a|o)dlico so equivalentes e ambas descrevem "psicadlico" e "psicodlico". Por fim, a terceira operao a quantificao (ou repetio). Um quantificador aps

um token (como um caractere) ou um agrupamento especifica a quantidade de vezes que o elemento precedente pode ocorrer. Os quantificadores mais comuns so ?, * e +. O ponto de interrogao indica que h zero ou uma ocorrncia do elemento precedente. Por exemplo, ac?o casa tanto "aco" quanto "ao". J o asterisco indica que h zero ou mais ocorrncias do elemento precedente. Por exemplo, ab*c casa "ac", "abc", "abbc", "abbbc", e assim por diante. Por fim, o sinal de adio indica que h uma ou mais ocorrncias do elemento precedente. Por exemplo, ab+c casa "abc", "abbc", "abbbc", e assim por diante, mas no "ac". (WIKIPEDIA) Essas construes podem ser combinadas arbitrariamente para formar expresses complexas, assim como expresses aritmticas com nmeros e operaes de adio, subtrao, multiplicao e diviso. De forma geral, h diversas expresses regulares para descrever um mesmo conjunto de cadeias de caracteres. A sintaxe exata da expresso regular e os operadores disponveis variam entre as implementaes. ( WIKIPEDIA)

Tabela dos MetaCaracteres Busca posicionada Smbolo Descrio ^ Busca somente no incio da string. $ Busca somente no fim da string. \b Encontra em qualquer parte da string. \B Encontra qualquer parte que no esteja limitada.

Literais Smbolo Descrio Alfa-numrica Todos os caracteres alfabticos e numerais se encontram literalmente. \\ Encontra o caractere de escape.

Classes de Caracteres Smbolo Descrio Encontra qualquer caractere que estiver dentro do grupo. Voc pode usar hfen para denotar escala. Por Exemplo. [a-z] encontra qualquer letra do alfabeto. [0-9] encontra [abc] qualquer dgito. Encontra qualquer caractere que no estiver dentro do grupo. O circunflexo indica que nenhum caractere deve estar na string. [^abc] Observao: O circunflexo usado dentro da classe de caractere diferente do que denota o incio da string, no se confundam. A negao aqui s permitida dentro dos sinais. (Ponto). Encontra qualquer caractere exceto o caractere de nova linha ou terminador de . linha Unicode. Encontra qualquer caractere alfanumrico incluindo underscore. Equivalente a [a-zA\w Z0-9_]. Encontra qualquer caractere que no se encontra na classe dos alfanumricos. \W Equivalente a [^a-zA-Z0-9_]. \d Encontra qualquer dgito. Equivalente a [0-9]. \D Encontra qualquer caractere que no seja um dgito. Equivalente a [^0-9]. \s Encontra qualquer caractere que equivale a um espao. Equivalente a [ abc]. \S Encontra qualquer caractere que no equivale a um espao. Equivalente a [^abc].

Repetio Smbolo Descrio {x} Encontra exatamente x ocorrncia na expresso regular. {x,} Encontra x ou mais ocorrncias na expresso regular. {x,y} Encontra x para y numero de ocorrncias na expresso regular. ? Encontra zero ou nenhuma ocorrncia. Equivalente a {0,1}. * Encontra zero ou mais ocorrncias. Equivalente a {0,}. + Encontra uma ou mais ocorrncias. Equivalente a {1,}.

Alternao & Agrupamento Smbolo Descrio

() |

Agrupamento de caracteres para criar uma clusula de condio. Pode estar aninhado. Combina clusulas de condies dentro de uma expresso regular e ento encontra qualquer uma das clusulas. Similar expresso "OR".

BackReferences Smbolo Descrio Encontra uma clusula entre parnteses. n o nmero de clusulas para a esquerda da ( )\n backReference.

Conhecendo o Espao de Nomes System.Text.RegularExpressions

A plataforma .NET fornece vrias classes para ajudar os desenvolvedores a reconhecerem e manipularem expresses regulares. A classe Regex (espao de nomes System.Text.RegularExpressions) representa uma expresso regular imutvel. Ela contm mtodos estticos que permitem o uso da classe Regex sem instanciar explicitamente objetos dessa classe. A classe Match representa os resultados de uma operao de correspondncia com uma expresso regular. (DEITEL, 2006)

A classe Regex fornece o mtodo Match, que retorna um objeto da classe Match representando uma nica correspondncia com uma expresso regular. Regex tambm fornece o mtodo Matches, que retorna todas as correspondncias de uma expresso regular em uma string arbitrria e retorna um objeto MatchCollection, ou seja, um conjunto de objetos Match. (DEITEL, 2006)

Agora que j aprendemos sobre Expresses Regulares na teoria, vamos ver na prtica como isso funciona e como pode ser utilizado em uma

aplicao Web. Abra o Visual Studio 2005/2008 ou Web Developer 2005/2008, crie um novo Web Site e d o nome de ExpressoesRegulares.

Abra o arquivo Default.aspx e adicione um controle Label e um controle Button ao formulrio. Para o controle Button, adicione o evento Button1_Click conforme a listagem_01 apresentada abaixo.

<form id="form1" runat="server"> <table id="table1" cellpadding="0" cellspacing="0" border="0" width="720px"> <tr> <td colspan="3"><asp:Label ID="Label1" runat="server" Text="">asp:Label>td> tr> <tr> <td height="30px" colspan="3">td> tr> <tr> <td width="30%" align="right">Testar:td> <td> td> <td align="left"><asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />td> tr> table> form>

Cdigo exemplo: listagem_01

Depois de j ter concludas as alteraes no formulrio, abra o arquivo Default.aspx.cs e adicione o seguinte cdigo, conforme a listagem_02 apresentada abaixo.

protected void Button1_Click(object sender, EventArgs e) { //Expresso regular que aceita somente nmeros inteiros string numero = @"^\d+$"; //ou string numero2 = @"^[0-9]+$";

Match match = Regex.Match("10", numero2);

Label1.Text = "Nmero inteiro invlido. "; if (match.Success) { Label1.Text = "Nmero inteiro vlido. "; }

//Expresso regular que aceita nmeros reais

string numeroReal = @"^\d+?(.|,\d+)$"; //ou string numeroReal2 = @"^[0-9]+?(.|,[0-9]+)$";

match = Regex.Match("10.456", numeroReal2);

if (match.Success) { Label1.Text += "Nmero real vlido. "; } else { Label1.Text += "Nmero real invlido. "; }

//Expressao regular que valida email string email = @"^([\w\-]+\.)*[\w\- ]+@([\w\- ]+\.)+([\w\]{2,3})$"; match = Regex.Match("werison.faw@gmail.com", email);

if (match.Success)

{ Label1.Text += "Email vlido. "; } else { Label1.Text += "Email invlido. "; }

//Expresso regular que valida telefone string telefone = @"^\d{2}-\d{4}-\d{4}$"; //ou string telefone2 = @"^[0-9]{2}-[0-9]{4}-[0-9]{4}$"; match = Regex.Match("14-1234-4567", telefone2);

if (match.Success) { Label1.Text += "Telefone vlido. "; } else {

Label1.Text += "Telefone invlido. "; }

//Expressao regular que valida cpf string cpf = @"^\d{3}\.?\d{3}\.?\d{3}\-?\d{2}$"; match = Regex.Match("111.111.111-11", cpf);

if (match.Success) { Label1.Text += "CPF vlido. "; } else { Label1.Text += "CPF invlido. "; }

//Expressao regular que valida cnpj string cnpj = @"^\d{3}.?\d{3}.?\d{3}/?\d{3}-?\d{2}$"; match = Regex.Match("111.111.111/111-11", cnpj);

if (match.Success) { Label1.Text += "CNPJ vlido. "; } else { Label1.Text += "CNPJ invlido. "; }

//Expressao regular que valida data string data = @"^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[02])|31\/(0[13578]|1[02]))\/\d{4}$"; match = Regex.Match("01/01/2000", data);

if (match.Success) { Label1.Text += "Data vlida. "; } else {

Label1.Text += "Data invlida. "; }

//Expressao regular que valida cep string cep = @"^\d{5}\-?\d{3}$"; match = Regex.Match("09740-001", cep);

if (match.Success) { Label1.Text += "CEP vlido. "; } else { Label1.Text += "Cep invlido. "; }

//Expressao regular que valida url string url = @"^((http)|(https)|(ftp)):\/\/([\- \w]+\.)+\w{2,3}(\/ [%\-\w]+(\.\w{2,})?)*$"; match = Regex.Match("http://neocanvas.aspbrasil.net", url);

if (match.Success) { Label1.Text += "URL vlida. "; } else { Label1.Text += "URL invlida. "; }

//Expressao regular que valida ip string ip = @"^\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b$"; match = Regex.Match("127.0.0.0", ip);

if (match.Success) { Label1.Text += "IP vlido. "; } else { Label1.Text += "IP invlido. ";

//Expressao regular que valida nomes string nome = @"^([\'\.\^\~\\`\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\aAzZ]+)+((\s[\'\.\^\~\\`\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\aA-zZ]+)+)?$"; //ou string nome2 = @"^[aA-zZ]+((\s[aA-zZ]+)+)?$"; match = Regex.Match("werison aparecido fernandes", nome2);

if (match.Success) { Label1.Text += "Nome vlido. "; } else { Label1.Text += "Nome invlido. "; } }

Antes que voc queira comear a testar o cdigo acima, vamos entender o que faz cada um dos mtodos utilizados, bem como as expresses regulares construdas.

Regex.Match(string input, string pattern); @param = string input: O valor de entrada a ser validado. Exemplo: cep:09841-000. @param= string pattern: A expresso a ser testada. Exemplo: cep: @"^\d{5}\-?\d{3}$". @return= Match: Objeto da classe Match que define um conjunto de mtodos e atributos para a manipulao de expresses regulares.

Regex.Match(string input, string pattern); match.Success @return= bool: Retorna um valor booleano indicando se o teste Match foi bem-sucedido. Exemplo: true.

Entendendo as Expresses Regulares

string numero = @"^\d+$"

^: Indica o comeo da linha. Caso seja omitido esse caractere, ser permitida a entrada de qualquer tipo de caractere no incio da expresso. Exemplo: w\?;.,io12306, nesse caso seria uma expresso vlida.

\d+: Permite somente nmeros. A barra invertida escapa o caractere d. Caso seja omitida, significa que estar permitindo sucessivamente vrias ocorrncias da letra d e no nmeros. Exemplo: dddd. +: Permite vrias ocorrncias de um caractere ou pelo menos uma ocorrncia. $: indica o final da linha. Caso seja omitido esse caractere, ser permitida a entrada de qualquer tipo de caractere no final da expresso. Exemplo:12345we.,?/;t, nesse caso seria uma expresso vlida.

//ou string numero2 = @"^[0-9]+$"

A diferena entre a primeira expresso e a segunda a ocorrncia da seqncia de caracteres [0-9]. [0-9]: Tem o mesmo efeito que \d, ou seja, permite apenas nmeros. Nesse caso pode ser informado explicitamente todos os caracteres vlidos na expresso. Exemplo: [0,1,2,3,4,5,6,7,8,9]. Pode ser informado implicitamente como a expresso que estamos estudando [0-9]. O sinal indica a condio de sequncia, onde informado o primeiro e o tlimo caractere da sequncia e o sistema se encarrega de mapear o intervalo.

string numeroReal = @"^\d+?(.|,\d+)$" //ou string numeroReal2 = @"^[0-9]+?(.|,[0-9]+)$"

?: Indica que tudo que estiver depois na expresso opcional.

(.|,[0-9]+): Assim como na matemtica os parnteses servem para agrupar expresses. .|,: O pipe na expresso tem o significado do ou lgico, ou seja, tanto o que tiver a direita ou a esquerda da expresso pode ocorrer, sendo uma ocorrncia por vez.

string email = @"^([\w\-]+\.)*[\w\- ]+@([\w\- ]+\.)+([\w\-]{2,3})$"

\w: Permite a entrada de qualquer caratere alfanumrico incluindo underscore. \-: Permite a entrada do caractere -. \.: Permite a entrada do caractere .. *: Permite zero ou vrias ocorrncias de tudo que est a esquerda desse caractere na expresso. @: Obriga a ocorrncia desse caractere na expresso. {2,3}: Permite x ocorrncias de tudo que est a esquerda desse conjunto na expresso, onde x o nmero indicado entre {}, nesse caso 2 ou 3.

string telefone = @"^\d{2}-\d{4}-\d{4}$"; //ou string telefone2 = @"^[0-9]{2}-[0-9]{4}-[0-9]{4}$";

No h nada diferente do que j foi explicado anteriormente.

string cpf = @"^\d{3}\.?\d{3}\.?\d{3}\-?\d{2}$";

No h nada diferente do que j foi explicado anteriormente.

string cnpj = @"^\d{3}.?\d{3}.?\d{3}/?\d{3}-?\d{2}$";

No h nada diferente do que j foi explicado anteriormente.

string data = @"^((0[1-9]|[12]\d)\/(0[1-9]|1[0-2])|30\/(0[13-9]|1[02])|31\/(0[13578]|1[02]))\/\d{4}$";

0[1-9]: Permite a ocorrncia do caractere 0 seguido de um caratere que pode variar de 1-9. Exemplo: 01, 09. [12]\d: Permite a ocorrncia de do caractere 1 ou 2 [12] seguido de um nmero que pode variar de 0-9. \/: Escapa o caractere barra normal. 1[0-2]): Permite a ocorrncia do caractere 1 seguido dos caracteres 0, 1, 2. Uma ocorrncia por vez. 0[13-9]: Permite a ocorrncia do caractere 0 seguido dos caractes 1 ou 3, ou ainda a sequncia dos caracteres que podem variar de 4-9. Exemplo: 01, 03, 04; 09 so aceitos. Observao 02 no ser aceito.

string cep = @"^\d{5}\-?\d{3}$";

No h nada diferente do que j foi explicado anteriormente.

string url = @"^((http)|(https)|(ftp)):\/\/([\- \w]+\.)+\w{2,3}(\/[%\\w]+(\.\w{2,})?)*$";

No h nada diferente do que j foi explicado anteriormente.

string nome = "^([\'\.\^\~\\`\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\aAzZ]+)+((\s[\'\.\^\~\\`\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\aA-zZ]+)+)?$"; //ou string nome2 = @"^[aA-zZ]+((\s[aA-zZ]+)+)?$"

"([\'\.\^\~\\`\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\aA-zZ]+): Permite a ocorrncia de todas as letras do alfabeto em caixa alta e em caixa baixa (aA-zZ). Os demais caracteres na expresso causam a excesso, que neste caso se faz necessrio porque a expresso (aA-zZ), no permite caracteres acentuados. \s: Permite o caractere espao na expresso.

Agora que j entendemos o funcionamento de cada uma das expresses apresentadas, vamos testar nossa aplicao. Voc pode ainda entrar com novos valores, para testar novas situaes ainda no testar. Rode a aplicao e veja os resultados. Observe se voc obteve os mesmos resultados apresentados na figura abaixo.

Espero que vocs tenham gostado desse artigo. Um grande abrao a todos e at a prxima.

Referncias Bibliogrficas

[DEITEL P., DEITEL J. 2006] DEITEL P., DEITEL J. C# Como Programar. So Paulo: Editora Person Makron books, 2006. P. 572

[WIKIPEDIA] WIKIPEDIA, http://pt.wikipedia.org/wiki/Express%C3%A3o_regular, acessado em 04/03/2009.