$30 off During Our Annual Pro Sale. View Details »

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

Aurelio Jargas

October 14, 2015
Tweet

More Decks by Aurelio Jargas

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

  3. http://piazinho.com.br

    View Slide

  4. Regex?
    É de comer?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. (mini|super|hiper)mercado

    View Slide

  9. (mini|super|hiper)mercado

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  19. .*

    View Slide

  20. .*

    View Slide

  21. .*
    Olá
    1, 2, 3, testando...
    negrito

    View Slide

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

    View Slide

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

    View Slide

  24. NÃO É
    glob
    regex

    View Slide

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

    View Slide

  26. Onde usar
    expressões regulares?

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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}$';

    View Slide

  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

    View Slide

  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');

    View Slide



  33. CEP:



    View Slide

  34. Substituição
    replace

    View Slide

  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?

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  42. Legível
    Complexo

    View Slide

  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}





    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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}

    View Slide

  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}
    [email protected] [email protected] [email protected]
    não existe ninguém lê outro lê

    View Slide

  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

    View Slide

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

    View Slide

  51. $

    View Slide