Expressões regulares
Gabriell Nascimento
ERs
●Método para especificar padrões de texto
●a.k.a.: ER, RE, Regex, Regexp
ERs
●Surgiram na matemática
●Adicionadas ao ed
●Biblioteca regex em C
Pra que servem?
●Busca
●Substituição
●Validação
●Filtragem
●Ganhar almoço
●…
Como funcionam?
●Interpretador de expressões
●Texto é comparado à expressão
Conjunto de metacaracteres e caracteres
literais que especifica um padrão de texto
Numa casca de noz
Metacaracteres
. [] ? * + {} ^ $ | ()
Metacaracteres
●Representantes: . [] [^]
●Quantificadores: ? * + {}
●Âncoras: ^ $ b
●Outros: | ()  1..9
Representantes
Ponto .
oQualquer caractere
Lista [...]
oCaracteres permitidos
Lista negada [^...]
oCaracteres proibidos
Exemplo
.ato
oGato, gato, .ato, 1ato, …
[gpr]ato
ogato, pato, rato
[^gpr]ato
o.ato, 1ato, Gato, Pato, Rato, …
Quantificadores
Opcional ?
o Zero ou um
Asterisco *
o Zero, um ou mais
Mais +
o Um ou mais
Chaves {n,m}
o De n a m
Exemplo
Ei!?
o Ei, Ei!
Ei!*
o Ei, Ei!, Ei!!!!!, …
Ei!+
o Ei!, Ei!!!!!, …
Ei!{2,5}
o Ei!!, Ei!!!, Ei!!!!, Ei!!!!!
Âncoras
Circunflexo ^
oInício da linha
Cifrão $
oFim da linha
Borda b
oInício ou fim da palavra
Exemplo
^[a-z].+
oaa, b1, c^!1, …
.+[a-z]$
o123a, 1b, aa, .z, $12d, …
diab
odia, melodia, bom-dia, …
Outros
Escape 
o Torna literal um caractere
Ou |
o Ou um ou outro
Grupo (...)
o Delimita um grupo
Retrovisor 1..9
o Guarda texto casado nos grupos 1..9
Exemplo
hoje??
o hoje, hoje?
noite|tarde
o Boa noite, boa tarde, …
(nyan)+
o nyan, nyannyan, nyannyannyannyannyannyan
(bom)1
o bombom
Mas primeiro!
Mas primeiro!
Algumas dicas.
Dica #1
Saiba o que você quer
Dica #2
Seja específic[ao]
Dica #3
KISS
(Keep It Simple, Stupid!)
Dica #4
Saiba quando usar
$ cat /tmp/log.txt
1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 42
1.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /nao/tem HTTP/1.1" 404 42
$ cat /tmp/log.txt
1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 42
1.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /nao/tem HTTP/1.1" 404 42
$ egrep -o "[(/?.*){2}(:.*){3}]" /tmp/log.txt
[17/Sep/2015:18:00:00 -0300]
[17/Sep/2015:18:00:02 -0300]
[17/Sep/2015:18:00:05 -0300]
[17/Sep/2015:18:00:10 -0300]
[17/Sep/2015:18:00:10 -0300]
$ cat /tmp/log.txt
1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 42
1.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /nao/tem HTTP/1.1" 404 42
# Aplicando dicas 1 e 2
$ egrep -o "[0-9]{2}/[A-Z][a-z]{2}/[0-9]{4}(:[0-9]{2}){3}" /tmp/log.txt
17/Sep/2015:18:00:00
17/Sep/2015:18:00:02
17/Sep/2015:18:00:05
17/Sep/2015:18:00:10
17/Sep/2015:18:00:10
$ cat /tmp/log.txt
1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 42
1.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /nao/tem HTTP/1.1" 404 42
# Aplicando dica 3
$ egrep -o "[0-9]{2}/[A-Z][a-z]{2}/[0-9]{4}:[0-9]{2}:[0-9]{2}:[0-9]{2}" 
/tmp/log.txt
17/Sep/2015:18:00:00
17/Sep/2015:18:00:02
17/Sep/2015:18:00:05
17/Sep/2015:18:00:10
17/Sep/2015:18:00:10
$ cat /tmp/log.txt
1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 42
1.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 512
1.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /nao/tem HTTP/1.1" 404 42
# Aplicando dicas 3 e 4
$ cut -d' ' -f4 /tmp/log.txt | tr -d '['
17/Sep/2015:18:00:00
17/Sep/2015:18:00:02
17/Sep/2015:18:00:05
17/Sep/2015:18:00:10
17/Sep/2015:18:00:10
Para saber mais
4 fun!
http://regexcrossword.com/
http://xkcd.com/208/
http://xkcd.com/1171/
Obrigado!

20150917 expressoes regulares