20150917 expressoes regulares
TRANSCRIPT
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
RepresentantesPonto .
oQualquer caractere Lista [...]
oCaracteres permitidosLista negada [^...]
oCaracteres proibidos
Exemplo.ato
oGato, gato, .ato, 1ato, … [gpr]ato
ogato, pato, rato[^gpr]ato
o .ato, 1ato, Gato, Pato, Rato, …
QuantificadoresOpcional ?
o Zero ou umAsterisco *
o Zero, um ou maisMais +
o Um ou maisChaves {n,m}
o De n a m
ExemploEi!?
o Ei, Ei!Ei!*
o Ei, Ei!, Ei!!!!!, … Ei!+
o Ei!, Ei!!!!!, … Ei!{2,5}
o Ei!!, Ei!!!, Ei!!!!, Ei!!!!!
ÂncorasCircunflexo ^
o Início da linhaCifrão $
oFim da linhaBorda \b
o Início ou fim da palavra
Exemplo^[a-z].+
oaa, b1, c^!1, … .+[a-z]$
o123a, 1b, aa, .z, $12d, … dia\b
odia, melodia, bom-dia, …
OutrosEscape \
o Torna literal um caractere Ou |
o Ou um ou outroGrupo (...)
o Delimita um grupoRetrovisor \1..\9
o Guarda texto casado nos grupos 1..9
Exemplohoje\??
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 #1Saiba o que você quer
Dica #2Seja específic[ao]
Dica #3KISS
(Keep It Simple, Stupid!)
Dica #4Saiba quando usar
$ cat /tmp/log.txt1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 421.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /nao/tem HTTP/1.1" 404 42
$ cat /tmp/log.txt1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 421.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 5121.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.txt1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 421.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 5121.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.txt17/Sep/2015:18:00:0017/Sep/2015:18:00:0217/Sep/2015:18:00:0517/Sep/2015:18:00:1017/Sep/2015:18:00:10
$ cat /tmp/log.txt1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 421.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 5121.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.txt17/Sep/2015:18:00:0017/Sep/2015:18:00:0217/Sep/2015:18:00:0517/Sep/2015:18:00:1017/Sep/2015:18:00:10
$ cat /tmp/log.txt1.2.3.4 - - [17/Sep/2015:18:00:00 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.4 - - [17/Sep/2015:18:00:02 -0300] "GET /nao/tem HTTP/1.1" 404 421.2.3.3 - - [17/Sep/2015:18:00:05 -0300] "GET /exemplo HTTP/1.1" 200 5121.2.3.3 - - [17/Sep/2015:18:00:10 -0300] "GET /exemplo HTTP/1.1" 200 5121.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:0017/Sep/2015:18:00:0217/Sep/2015:18:00:0517/Sep/2015:18:00:1017/Sep/2015:18:00:10
Para saber mais
4 fun!http://regexcrossword.com/http://xkcd.com/208/http://xkcd.com/1171/
Obrigado!