20150917 expressoes regulares

Preview:

Citation preview

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!