Uma composição de símbolos, caracteres com funções especiais, que, agrupados entre si e com caracteres literais, formam uma seqüência, uma expressão. Essa expressão é interpretada como uma regra, que indicará sucesso se uma entrada de dados qualquer casar com essa regra, ou seja, obedecer exatamente a todas as suas condições.
2. 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.
3. 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
4. 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.
5. 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
6. 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.
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.
16. 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
17. 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
18. 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.
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 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.
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.