Expressões Regulares

Expressões Regulares

Palestra de 1h, direcionada a quem nunca viu/usou expressões regulares. Tenta desmistificar o assunto fazendo com que o público tente “adivinhar” o que faz algumas das expressões mostradas na apresentação. Depois demonstra onde as expressões podem ser utilizadas na vida real.

Apresentada em 2015-10-14 na Latinoware 2015 (Foz do Iguaçu-PR) http://2015.latinoware.org

Apresentada em 2015-10-24 no 3º Café com Software Livre (Indaial-SC) http://blusol.org

Apresentada em 2016-01-26 na empresa ContaAzul (Joinville-SC) https://contaazul.com

Apresentada em 2016-09-22 na XVIII Semana da Computação UDESC (Joinville-SC) http://www.semanadacomputacao.joinville.udesc.br

E583bca48acb877efd4a29229bf7927f?s=128

Aurelio Jargas

October 14, 2015
Tweet

Transcript

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

  2. http://aurelio.net/regex/guia

  3. http://piazinho.com.br

  4. Regex? É de comer?

  5. cora[çc][ãa]o

  6. cora[çc][ãa]o

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

  8. (mini|super|hiper)mercado

  9. (mini|super|hiper)mercado

  10. (mini|super|hiper)mercado minimercado supermercado hipermercado

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

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

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

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

  15. \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

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

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

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

  19. <p>.*</p>

  20. <p>.*</p>

  21. <p>.*</p> <p>Olá</p> <p>1, 2, 3, testando...</p> <p><b>negrito</b></p>

  22. cora[çc][ãa]o (mini|super|hiper)mercado \d\d\.\d\d\d-\d\d\d \d{3}\.\d{3}\.\d{3}-\d{2} <p>.*</p>

  23. cora[çc][ãa]o (mini|super|hiper)mercado \d\d\.\d\d\d-\d\d\d \d{3}\.\d{3}\.\d{3}-\d{2} <p>.*</p>

  24. NÃO É glob regex

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

  26. Onde usar expressões regulares?

  27. 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
  28. 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
  29. • 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
  30. • 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}$';
  31. • C • C# • C++ • Delphi • Go

    • Haskell • Java • JavaScript • Lua Linguagens de programação • Objective-C • Perl • PHP • Python • R • Ruby • Scala • Tcl • Visual Basic
  32. // 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');
  33. <!-- Expressões regulares no HTML5 --> <form name="cadastro1"> CEP: <input

    type="text" name="cep" pattern="\d{2}\.\d{3}-\d{3}"> <input type="submit"> </form>
  34. Substituição replace

  35. Procure por: Troque por: P[A-Z]+ XX Você votou no PV,

    PSC, PSOL ou PSTU? Você votou no XX, XX, XX ou XX?
  36. Procure por: Troque por: (.*) “$1” Oi, tudo bem? Tudo

    bem. “Oi, tudo bem?” “Tudo bem.”
  37. Procure por: Troque por: (n[ãa]o) <b>$1</b> Tenho muito a dizer!

    Mas não lembro agora... Tenho muito a dizer! Mas <b>não</b> lembro agora...
  38. 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
  39. Procure por: Troque por: (\d{2})(\d{3})(\d{3}) $1.$2-$3 80220320 87654321 80.220-320 87.654-321

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

  41. 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

  42. Legível Complexo

  43. 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}

    ➊ ➋ ➌ ➍ ➎
  44. Expressão Regular pode não ser a melhor solução

  45. ✓ 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
  46. # Python import datetime datetime.datetime.strptime( "31/12/1999", "%d/%m/%Y" )

  47. 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}

  48. 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} zzz@zzz.zzz foo@example.com

    asdf@gmail.com não existe ninguém lê outro lê
  49. 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
  50. Onde praticar? http://regexpal.com http://regex101.com

  51. $