Slide 1

Slide 1 text

Expressões Regulares Aurelio Jargas http://aurelio.net @oreio

Slide 2

Slide 2 text

http://aurelio.net/regex/guia

Slide 3

Slide 3 text

http://piazinho.com.br

Slide 4

Slide 4 text

Regex? É de comer?

Slide 5

Slide 5 text

cora[çc][ãa]o

Slide 6

Slide 6 text

cora[çc][ãa]o

Slide 7

Slide 7 text

cora[çc][ãa]o coração coraçao coracão coracao

Slide 8

Slide 8 text

(mini|super|hiper)mercado

Slide 9

Slide 9 text

(mini|super|hiper)mercado

Slide 10

Slide 10 text

(mini|super|hiper)mercado minimercado supermercado hipermercado

Slide 11

Slide 11 text

(mini|super|hiper)?mercado minimercado supermercado hipermercado mercado

Slide 12

Slide 12 text

\d\d\.\d\d\d-\d\d\d

Slide 13

Slide 13 text

\d\d\.\d\d\d-\d\d\d

Slide 14

Slide 14 text

\d\d\.\d\d\d-\d\d\d 80.000-000 80.220-320 12.345-678 77.777-777

Slide 15

Slide 15 text

\d\d\.\d\d\d-\d\d\d \d{2}\.\d{3}-\d{3} 80.000-000 80.220-320 12.345-678 77.777-777

Slide 16

Slide 16 text

\d{3}\.\d{3}\.\d{3}-\d{2}

Slide 17

Slide 17 text

\d{3}\.\d{3}\.\d{3}-\d{2}

Slide 18

Slide 18 text

\d{3}\.\d{3}\.\d{3}-\d{2} 015.010.014-55 685.706.259-13 243.287.109-71 999.999.999-99

Slide 19

Slide 19 text

.*

Slide 20

Slide 20 text

.*

Slide 21

Slide 21 text

.*

Olá

1, 2, 3, testando...

negrito

Slide 22

Slide 22 text

cora[çc][ãa]o (mini|super|hiper)mercado \d\d\.\d\d\d-\d\d\d \d{3}\.\d{3}\.\d{3}-\d{2}

.*

Slide 23

Slide 23 text

cora[çc][ãa]o (mini|super|hiper)mercado \d\d\.\d\d\d-\d\d\d \d{3}\.\d{3}\.\d{3}-\d{2}

.*

Slide 24

Slide 24 text

NÃO É glob regex

Slide 25

Slide 25 text

.*\.txt [aeiou].* musica\.(mp3|wav) foto-..\.jpg *.txt [aeiou]* musica.{mp3,wav} foto-??.jpg Regex Glob

Slide 26

Slide 26 text

Onde usar expressões regulares?

Slide 27

Slide 27 text

Editores de texto ● Emacs ● Vim ● gedit ● Kate ● Sublime Text ● Atom ● TextMate ● Notepad++ IDE, Office ● Android Studio ● Eclipse ● Xcode ● Visual Studio ● LibreOffice ● Google Planilhas ● Microsoft Word

Slide 28

Slide 28 text

Linha de comando ● Bash ● grep ● sed ● awk ● find ● PowerShell # Usuários com ID de 5 dígitos e shell Bash egrep '^.*:x:[0-9]{5}:.*bash$' /etc/passwd

Slide 29

Slide 29 text

● Apache ● Nginx Servidores HTTP # Usar URLs amigáveis em vez de query strings feiosas # De: http://example.com/produto/1234/info # Para: http://example.com/produto.php?id=1234&action=info RewriteEngine on RewriteRule "^/(\w+)/(\d+)/(\w+)$" /$1.php?id=$2&action=$3

Slide 30

Slide 30 text

● MySQL ● MariaDB ● PostgreSQL ● SQLite ● Oracle Bancos de dados -- Listar veículos com placas fora do padrão AAA-9999 SELECT * FROM veiculos WHERE placa NOT REGEXP '^[A-Z]{3}-\d{4}$';

Slide 31

Slide 31 text

● C ● C# ● C++ ● Delphi ● Go ● Haskell ● Java ● JavaScript ● Lua Linguagens de programação ● Objective-C ● Perl ● PHP ● Python ● R ● Ruby ● Scala ● Tcl ● Visual Basic

Slide 32

Slide 32 text

// JavaScript, trechos de código do MiGuXeiToR :) // Remove acentuação t = t.replace(/[áàâãä]/gi, 'a'); t = t.replace( /[éèêë]/gi, 'e'); t = t.replace( /[íìîï]/gi, 'i'); t = t.replace(/[óòôõö]/gi, 'o'); t = t.replace( /[úùûü]/gi, 'u'); // por quê, porquê, porque, por que -> pq t = t.replace(/\bpor\s?qu[eê]/gi, 'pq'); // então -> entaum, não -> naum t = t.replace(/ão\b/gi, 'aum');

Slide 33

Slide 33 text

CEP:

Slide 34

Slide 34 text

Substituição replace

Slide 35

Slide 35 text

Procure por: Troque por: P[A-Z]+ XX Você votou no PV, PSC, PSOL ou PSTU? Você votou no XX, XX, XX ou XX?

Slide 36

Slide 36 text

Procure por: Troque por: (.*) “$1” Oi, tudo bem? Tudo bem. “Oi, tudo bem?” “Tudo bem.”

Slide 37

Slide 37 text

Procure por: Troque por: (n[ãa]o) $1 Tenho muito a dizer! Mas não lembro agora... Tenho muito a dizer! Mas não lembro agora...

Slide 38

Slide 38 text

Procure por: Troque por: (\d\d):(\d\d) $1 horas e $2 minutos 12:34 23:59 12 horas e 34 minutos 23 horas e 59 minutos

Slide 39

Slide 39 text

Procure por: Troque por: (\d{2})(\d{3})(\d{3}) $1.$2-$3 80220320 87654321 80.220-320 87.654-321

Slide 40

Slide 40 text

Procure por: Troque por: [^0-9] 80.220-320 12.345-678 80220320 12345678

Slide 41

Slide 41 text

Procure por: Troque por: (\d{4})-(\d{2})-(\d{2}) $3/$2/$1 2015-10-14 1999-12-31 14/10/2015 31/12/1999

Slide 42

Slide 42 text

Legível Complexo

Slide 43

Slide 43 text

Casar uma data: dd/mm/aaaa ../../.... \d{2}/\d{2}/\d{4} [0123][0-9]/[01][0-9]/[12][0-9]{3} (0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/[12][0-9]{3} ((0[1-9]|[12][0-9])/02|(0[1-9]|[12][0-9]|30)/(0[469]|11) |(0[1-9]|[12][0-9]|3[01])/(0[13578]|1[02]))/[12][0-9]{3} ➊ ➋ ➌ ➍ ➎

Slide 44

Slide 44 text

Expressão Regular pode não ser a melhor solução

Slide 45

Slide 45 text

✓ 31 dias ✓ 12 meses ✓ Ano 1000 a 2999 ✓ Fevereiro até 29 ((0[1-9]|[12][0-9])/02|(0[1-9]|[12][0- 9]|30)/(0[469]|11)|(0[1-9]|[12][0-9]|3 [01])/(0[13578]|1[02]))/[12][0-9]{3} ✗ Ano bissexto ✗ Feriados ✗ Dias úteis

Slide 46

Slide 46 text

# Python import datetime datetime.datetime.strptime( "31/12/1999", "%d/%m/%Y" )

Slide 47

Slide 47 text

Validar e-mail com regex .*@.* [^@]+@[^@]+ [A-Za-z0-9_.-]+@[A-Za-z0-9_.]+ [A-Za-z0-9_.-]+@([A-Za-z0-9_]+\.)+[A-Za-z]{2,6}

Slide 48

Slide 48 text

Validar e-mail com regex .*@.* [^@]+@[^@]+ [A-Za-z0-9_.-]+@[A-Za-z0-9_.]+ [A-Za-z0-9_.-]+@([A-Za-z0-9_]+\.)+[A-Za-z]{2,6} [email protected] [email protected] [email protected] não existe ninguém lê outro lê

Slide 49

Slide 49 text

Validar e-mail com regex .*@.* [^@]+@[^@]+ [A-Za-z0-9_.-]+@[A-Za-z0-9_.]+ [A-Za-z0-9_.-]+@([A-Za-z0-9_]+\.)+[A-Za-z]{2,6} Mande um e-mail de confirmação

Slide 50

Slide 50 text

Onde praticar? http://regexpal.com http://regex101.com

Slide 51

Slide 51 text

$