Expressões Regulares
Metacaracteres tipo barra-letraOs metacaracteres do tipo barra-letra são átomos representados por uma barra
invertida \ seguida de uma letra qualquer, como \s e \W.
Dependendo da letra, muda-se o significado desse metacaractere.
Tudo começou nas linguagens de programação com os printf da vida, que
começaram a interpretar coisas, como \n e \t, para significar quebra de linha e TAB,
pois visualmente é ambíguo se "1 2" é um, TAB, dois ou um, espaços, dois.
Metacaracteres tipo barra-letraEssa representação simplificada e útil se tornou padrão e hoje a grande maioria dos
aplicativos os entende.\a alert alert(bipe)
\b backspace caractere backspace
\e escape catacatere ESC
\d form feed alimentação
\n new line nova linha
\r carriage return retorno de carro
\t htab tabulação horizontal
\v vtab tabulação vertical
Metacaracteres tipo barra-letraComo esses barra-letras também poderiam ser muito úteis para escrever nossas
expressões regulares, os robozinhos começaram a ter suporte a eles também, ou senão
a linguagem recebe a ER como um dado do tipo string e os interpreta, passando ao
robozinho seus valores literais.
Metacaracteres tipo barra-letra
b-l Equivalente POSIX Significa
\d [[:digit:]] Dígito
\D [^[:digit:]] Não-digito
\w [[:alnum:]_] Palavra
\W [^[:alnum:]_] Não-palavra
\s [[:space:]] Branco
\S [^[:space:]] Não-branco
Metacaracteres tipo barra-letraA grande diferença desses barra-letras para as classes POSIX, é que eles são válidos
fora das listas.
Dependendo do aplicativo, eles são válidos dentro das listas também, bagunçando
aquela regra que vimos de que dentro da lista todo mundo é normal. Dependendo
também, o sublinhado faz parte ou não do \w.
Exemplos de expressões
dd/mm/aaaa
Expressão Math
../../.... 12/05/1987, 99/99/9999
[0-9]{2}/[0-9]{2}/[0-9]{4} 10/10/2016, 99/99/9999
[0123][0-9]/[0-9]{2}/[0-9]{4} 10/10/2016, 19/99/9999
(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3} 10/10/2016
hh:mm
Expressão Math
..:.. 10:10, 99:99
[0-9]{2}:[0-9]{2} 10:10, 99:99
[012][0-9]:[0-5][0-9] 10:10
([01][0-9]|2[0-3]):[0-5][0-9] 10:10
Expressão Math
.*@.* [email protected], usuario@, usuario@email
[A-Za-z0-9_.-]+@([A-Za-z0-9_]+\.)+[A-Za-z]{2,4} [email protected]
telefone celular - xxxxx-xxxx
Expressão Math
…..-.... 99999-9999, aaaaa-bbbb
[0-9]{5}-[0-9]{4} 99999-9999
Regex engine - Baseadas em autômatos finitosProcessam mais rápido
Criam uma máquina de estado, alimentando-a com os caracteres de entrada.
Aplicações
Posix / GNU ERE / BRE - Usado na maioria dos utilitários Unix, como grep, sed e awk.
RE2 - Um projeto relativamente novo para tentar dar mais poder para o método baseado em autômatos.
Regex engine - Baseados em back-tracking
Compila o padrão em byte-code, semelhante a instruções da máquina.
O mecanismo então executa o código, saltando de instrução à instrução.
Aplicações:
Perl - O original. A maioria dos outros motores deste tipo tentam replicar a funcionalidade de regexes na
linguagem Perl.
PCRE - A implementação mais bem sucedida. Esta biblioteca é a implementação mais amplamente utilizada.
Ele tem um rico conjunto de recursos, alguns dos quais não podem ser considerados como "Regular"
mais.
Python , o Ruby , Java , .NET
Funcionamento do engine[a-z]
[a-z]*
[a-z]+
([0-9]{2})/([0-9]{2})/([0-9]{4})
Funcionamento do engine(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3}
[0-9]{3}\.?[0-9]{3}\.?[0-9]{3}\-?[0-9]{2}
PHP (PCRE)Característica Como fazer
Busca função preg_match
Substituição função preg_replace
Divisão função preg_split
ER crua 'entre aspas simples'
Ignore M/m Modificadores i (?i)
Global é o padrão
PHP (PCRE)
Funções PCRE Objetivo
preg_filter Substituição condicional
preg_grep Retorna opções de um array
preg_last_error Código de erro da última expressão executada
preg_match_all Casa globalmente e retorna o resultado
preg_match Casa e retorna o resultado
preg_quote Escapa metacaracteres
preg_replace_callback Substituição usando função
preg_replace Substituição
preg_split Divisão
Diferença entre PCRE e POSIXAs funções preg(PCRE) utilizam a biblioteca PCRE, que a partir da versão 5.3 do PHP
não pode ser desabilitada, sendo assim, estará sempre presente, essas funções são
compatíveis com estilo PERL e possuem características não disponíveis nas
funções ereg(POSIX).
A partir da versão 5.3 do PHP as funções ereg(POSIX) foram marcadas como
deprecated, ou seja, tornaram-se obsoletas e seu uso é desencorajado, além disso
toda vez que são utilizadas é lançado um notice do tipo E_DEPRECATED.
Exemplo
PHP Descrição Resultado
<?php$cep = '22710-045';$names = array('Diogo', 'Renato', 'Gomes', 'Thiago', 'Leonardo'); $er = '/^(\d){5}-(\d){3}$/'; if(preg_match($er, $cep)) { echo "O cep casou com a expressão."; }
$er = '/go/i';$pregReplace = preg_replace($er, 'GO', $names);print_r($pregReplace); $er = '/go$/';$pregFilter = preg_filter($er, 'GO', $names);print_r($pregFilter); $er = '/^go/i';$pregGrep = preg_grep($er, $names);print_r($pregGrep);
?>
Validação de CEP
Busca e substitui nomes que tenham "go", case-insensitive
Busca e substitui nomes que terminam com "go"
Resgatar nomes que começam com "go", case-insensitive
O cep casou com a expressão.
DioGO, Renato, GOmes, ThiaGO, Leonardo
DioGO, ThiaGO
Gomes
Exemplo
PHP Descrição Resultado
<?php
$names = array('Diogo', 'Renato', 'Gomes', 'Thiago', 'Leonardo');$text = 'Lorem ipsum dolor sit amet, consectetuer adipiscing.';
$er = '/[[:punct:]\s]\s*/';$pregSplit = preg_split($er, $text);print_r($pregSplit);
$callback = function($matches) { return strtoupper($matches[0]);};
$er = '/(.*)go$/';$pregCallback = preg_replace_callback($er, $callback, $names);print_r($pregCallback); ?>
Divide o texto por pontos e espaços, que podem ser seguidos por espaços
callback, retorna em letras maiúsculas
Busca e substitui de acordo com o callback
Array de palavras
DIOGO, Renato, Gomes, THIAGO, Leonardo
HTML 5No seu site ou aplicativo Web, se você digitar o CPF é necessário verificar se foi digitado corretamente. Como o formato é padronizado (nnn.nnn.nnn-nn), basta escrever uma expressão regular e tentar casá-la com o texto digitado.
Veja um Exemplo utilizando JavaScript.
HTML 5
HTML 5Funciona, mas é muito trabalhoso para fazer uma simples validação correto, imagine possuímos mais campos para validação. ex: nome, idade, e-mail, CNPJ, url etc. Outro problema é que a maneira de informar ao usuário sobre o erro (um alert() no exemplo) não é padronizada, cada site faz de um jeito. Porém apesar de todos os esforços se o usuário desativar o JavasScript, então nada funcionará.
O HTML 5 criou uma nova maneira de fazer essa validação, que é colocar a expressão regular diretamente no campo em questão, usando o novo atributo pattern.
Veja como fica o exemplo anterior.
HTML 5
E pronto! sem JavaScript, sem evento onsubmit, sem DOM, sem alert()resumindo, sem complicações. É o navegador que verificará se o texto digitado casa com a expressão e, se necessário avisará o usuário que há algo errado, de maneira padronizada. Use o atributo title para definir a mensagem que será mostrada ao usuário em caso de erro.
HTML 5
Ferramentas para testeshttp://regexr.com/
http://www.regextester.com/
http://regexstorm.net/tester
https://regex101.com/
https://www.debuggex.com/
http://regexlib.com/Search.aspx
Referênciashttp://www.diogomatheus.com.br/blog/php/expressoes-regulares-no-php/
http://turing.com.br/material/regex/introducao.html
http://www.devmedia.com.br/expressoes-regulares-em-php/25076
http://aurelio.net/regex/guia/
JARGAS, Aurelio Marinho. Expressões Regulares: Uma abordagem divertida. 4.ed. São Paulo: Novatec, 2012.
224p.
JARGAS, Aurelio Marinho. Expressões Regulares: Uma abordagem divertida. 3.ed. São Paulo: Novatec, 2009.
207p.