Expressões
Regulares
Metacaracteres tipo barra-letra
Os 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-letra
Essa 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-letra
Como 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-letra
A 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
usu@dom.zz
Expressão Math
.*@.* usuario@email.com, usuario@,
usuario@email
[A-Za-z0-9_.-]+@([A-Za-z0-9_]+.)+[A-Za-z]{2,4} usuario@email.com
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
finitos
Processam 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.
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 POSIX
As 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 5
No 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 5
Funciona, 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 testes
http://regexr.com/
http://www.regextester.com/
http://regexstorm.net/tester
https://regex101.com/
https://www.debuggex.com/
http://regexlib.com/Search.aspx
Referências
http://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.

Expressões Regulares - Final

  • 1.
  • 2.
    Metacaracteres tipo barra-letra Osmetacaracteres 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.
  • 3.
    Metacaracteres tipo barra-letra Essarepresentaçã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
  • 4.
    Metacaracteres tipo barra-letra Comoesses 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.
  • 5.
    Metacaracteres tipo barra-letra b-lEquivalente 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
  • 6.
    Metacaracteres tipo barra-letra Agrande 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.
  • 7.
  • 8.
    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
  • 9.
    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
  • 10.
    usu@dom.zz Expressão Math .*@.* usuario@email.com,usuario@, usuario@email [A-Za-z0-9_.-]+@([A-Za-z0-9_]+.)+[A-Za-z]{2,4} usuario@email.com
  • 11.
    telefone celular -xxxxx-xxxx Expressão Math …..-.... 99999-9999, aaaaa-bbbb [0-9]{5}-[0-9]{4} 99999-9999
  • 12.
    Regex engine -Baseadas em autômatos finitos Processam 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.
  • 13.
    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.
  • 14.
  • 15.
  • 16.
    PHP (PCRE) Característica Comofazer 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
  • 17.
    PHP (PCRE) Funções PCREObjetivo 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
  • 18.
    Diferença entre PCREe POSIX As 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.
  • 19.
    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
  • 20.
    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
  • 21.
    HTML 5 No seusite 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.
  • 22.
  • 23.
    HTML 5 Funciona, 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.
  • 24.
    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.
  • 25.
  • 26.
  • 27.
    Referências http://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.