([01][0-9]|2[0-3]):([0-5][0-9])

    Expressões Regulares

              André Willik Valenti

                Dextra Sistemas
Minicurso?
 Mote:
  Foco no basicão
 Objetivos:
  Apresentar assunto de forma prática
  Despertar interesse
  Dar o pontapé inicial
Expressões Regulares?
 Maneira elegante de manipular strings
 Sintaxe própria e relativamente padronizada
 Onipresente
   Linguagens de programação
   Editores de texto
   Ferramentas de desenvolvimento em geral
Para que servem
 Encontrar texto
 Processar texto
 Substituir texto
Aplicações
 Validação de entradas

 Aplicação de máscaras em campos
    CPF, datas, códigos etc.


 Filtragem de resultados em consultas

 (...)
Expressões regulares por aí
 URLs
 Endereços de e-mail
 Datas
 Caminhos de arquivo
 Trechos de código fonte
 (...)
Vc já usou e talvez nem saiba!
 SELECT * FROM pessoa WHERE
 sobrenome LIKE '%Silva%';

 ls *.txt

 dir *.sys
Como funcionam
 Essência
  Casamento de padrões
  Quantificadores
  Classes de caracteres
Como funcionam
 Casamento de padrões
  Padrão:
    aro
  Casa com:
    aro (posição 0)
    caro (posição 1)
    Amparo (posição 3)
Como funcionam
 Quantificadores
  1 ou mais: +
  0 ou mais: *
  0 ou 1: ?
 Exemplos
  a  ‘a’
  a+   ‘a’, ‘aa’, ‘aaa’, ...
  a*  ‘’, ‘a’, ‘aa’, ‘aaa’, ...
  a?   ‘’, ‘a’
Como funcionam
 Exemplos
  ab+c    ‘abc’, ‘abbc’, ‘abbbc’...
  ab?c    ‘ac’, ‘abc’
  ab*c   ‘ac’, ‘abc’, ‘abbc’, ‘abbbc’...
Como funcionam
 Classes de caracteres
  Dígito: d
  Letra: [A-Z], [a-z], [a-zA-Z]
  Letra, dígito ou ‘_’: w
 Exemplos:
  ddd    ‘000’, ‘012’, ‘321’, ‘999’, ‘821’, ...
  [a-z]w    ‘aa’, ‘ba’, ‘xy’, ‘zh’, ‘a1’, ‘x9’, ‘m_’...
  [A-Z]dd    ‘B12’, ‘P36’, ‘X89’, ...
Exemplos mais realistas
 Nome (ex: 'Luciana')
   [A-Z][a-z]*

 Hora (ex: '12:34')
   dd:dd

 Nome de variável (ex: 'minha_var_2')
   w+
Demonstração...
Como funcionam
 Classes de caracteres
  Espaço em branco: s
  Conjunto de possibilidades: [ ]
  Qualquer caractere: .
 Exemplos:
  as*b    ‘ab’, ‘a b’, ‘a b’, ‘a        b’, ...
  var[XYZ]      ‘varX’, ‘varY’, ‘varZ’
  1.   ‘1a’, ‘12’, ‘1;’, ‘1$’, ‘1~’, ...
  .*   qualquer coisa que caiba em uma linha!
Como funcionam
 Classes de negação
  Tudo que não for dígito: D
  Tudo que não for letra, dígito ou ‘_’: W
  Tudo que não for espaço em branco: S
  Tudo que não estiver no conjunto: [^ ]
 Exemplos:
  ddD  ‘12b’, ‘99/’, ‘23 ’, ...
  [^abc]+   ‘d’, ‘ef’, ‘xyzdef’, ‘123’, ‘[]{}()’, ...
Como funcionam
 Operador “ou”
  |
 Exemplos:
  abc|xyz       ‘abc’, ‘xyz’
  a|d    ‘a’, ‘1’, ‘2’, ‘3’,...
  a|x|2|5: o mesmo que [ax25]
Grupos
 Agrupam trechos de strings
 Úteis para:
  Extrair partes interessantes da string
  Substituir texto
Grupos
 Exemplo:
  HH:MM
  dd:dd valida a string
  Mas podemos fazer mais...
Grupos
 Exemplo:
  20:32
    Não nos interessa muito a string “20:32”
    Interessam-nos mais as substrings “20” e “32”
  (dd):(dd)
    Agrupamos partes da expressão regular
    Podemos recuperar os grupos usando 1, 2 etc.
Demonstração...
Expressões regulares por aí...
 Java
  import java.util.regex.Pattern;

  String regex = "dd:dd";
  Pattern.matches(regex, "12:34")
    true


  "uma str aqui".replaceAll("s", "_")
    "uma_string_aqui"
Expressões regulares por aí...
 Python
   import re

  regex = r'(dd)/(dd)/(dddd)'
  match = re.match(regex, '13/04/2011')

  match.group(0)   ‘13/04/2011’
  match.group(1)   ‘13’
  match.group(2)   ‘04’
  match.group(3)   ‘2011’
Expressões regulares por aí...
 JavaScript
  var str = 'JavaScript !';

  var regex1 = /w/;
  str.replace(regex1, '#')
    '#avaScript !'

  var regex2 = /w/g;
  str.replace(regex2, '#')
    '########## !'
Expressões regulares por aí...
 Ruby
  /abcd/ =~ 'abc4'    0
  /abcd/ =~ '0123abc789'    4
  /abcd/ =~ '0123456'    nil

  match =
   /(dd):(dd)/.match('12:34')
  match[1]    '12'
  match[2]    '34'
Expressões regulares por aí...
 Ruby
  'abcd1234'.gsub(/d/, '-')
  'a12b'.gsub(/a(dd)b/, 'ab1')

  Vejamos no irb...
Exercícios
 Extrair DDD, prefixo e terminal de um
 telefone:
   “(16) 3202-3934”    “16”, “3202”, “3934”


 Extrair somente dígitos de CPF:
   “123.456.789-00”     “12345678900”

 Extrair somente as consoantes da frase:
   “eu sou a luz das estrelas”   “slzdsstrls”
Outros metacaracteres
 Início da string: ^
 Fim da string: $
 Exemplos:
   ^function
     Casa com ‘function’, mas não com ‘f = function() { }’
   42$
     Casa com ‘var v = 42’, mas não com ‘var v = 42;’
   ^algumPadraoAqui$
     Casa somente quando o padrão ocupa a linha inteira
Outros metacaracteres
 Fronteira de palavra: b
 Exemplo:
   b[A-Za-z]+b
    Casa com todas as palavras de um arquivo
Mais quantificadores...
 {exato}
   d{7}     números com exatamente 7 dígitos


 {minimo,maximo}
   [a-z]{5,8}    5 a 8 letras minúsculas


 {minimo,}
   [A-Z]{3,}    3 ou mais letras maiúsculas
Mais aplicações...
 grep
   svn st | grep –E '.*j(ava|s)'


 Endereço IP
  d{1,3}.d{1,3}.d{1,3}.d{1,3}
Mais aplicações...
 Horário – versão mais precisa
  ([01][0-9]|2[0-3]):([0-5][0-9])

 Nome de variável – versão mais precisa
  [A-Za-z_$][w$]*
Mais aplicações...
 Endereço IP – versão radical
  (25[0-5]|2[0-4][0-9]|[01]?[0-
  9][0-9]?).(25[0-5]|2[0-4][0-
  9]|[01]?[0-9][0-9]?).(25[0-
  5]|2[0-4][0-9]|[01]?[0-9][0-
  9]?).(25[0-5]|2[0-4][0-
  9]|[01]?[0-9][0-9]?)
Referências
 Documentação Python
  http://docs.python.org/release/2.7/library/re.html?
  highlight=regex#regular-expression-syntax


 Documentação Java
  http://download.oracle.com/javase/1.4.2/docs/api/j
  ava/util/regex/Pattern.html
Referências
 Regular-Expressions.info (possui tutorial)
   http://www.regular-expressions.info/
 Crucial Concepts Behind Advanced Regular
 Expressions
   http://www.smashingmagazine.com/2009/05/06/in
   troduction-to-advanced-regular-expressions/
 Visualizador de expressões regulares
   http://strfriend.com/
Apêndice
 Ideias para futuros temas
   JPA – Java Persistence API
   Tratamento de exceções
   Desenvolvimento para iPhone / Android
   jQuery

Minicurso de Expressões Regulares

  • 1.
    ([01][0-9]|2[0-3]):([0-5][0-9]) Expressões Regulares André Willik Valenti Dextra Sistemas
  • 2.
    Minicurso? Mote: Foco no basicão Objetivos: Apresentar assunto de forma prática Despertar interesse Dar o pontapé inicial
  • 3.
    Expressões Regulares? Maneiraelegante de manipular strings Sintaxe própria e relativamente padronizada Onipresente Linguagens de programação Editores de texto Ferramentas de desenvolvimento em geral
  • 4.
    Para que servem Encontrar texto Processar texto Substituir texto
  • 5.
    Aplicações Validação deentradas Aplicação de máscaras em campos CPF, datas, códigos etc. Filtragem de resultados em consultas (...)
  • 6.
    Expressões regulares poraí URLs Endereços de e-mail Datas Caminhos de arquivo Trechos de código fonte (...)
  • 7.
    Vc já usoue talvez nem saiba! SELECT * FROM pessoa WHERE sobrenome LIKE '%Silva%'; ls *.txt dir *.sys
  • 8.
    Como funcionam Essência Casamento de padrões Quantificadores Classes de caracteres
  • 9.
    Como funcionam Casamentode padrões Padrão: aro Casa com: aro (posição 0) caro (posição 1) Amparo (posição 3)
  • 10.
    Como funcionam Quantificadores 1 ou mais: + 0 ou mais: * 0 ou 1: ? Exemplos a ‘a’ a+ ‘a’, ‘aa’, ‘aaa’, ... a* ‘’, ‘a’, ‘aa’, ‘aaa’, ... a? ‘’, ‘a’
  • 11.
    Como funcionam Exemplos ab+c ‘abc’, ‘abbc’, ‘abbbc’... ab?c ‘ac’, ‘abc’ ab*c ‘ac’, ‘abc’, ‘abbc’, ‘abbbc’...
  • 12.
    Como funcionam Classesde caracteres Dígito: d Letra: [A-Z], [a-z], [a-zA-Z] Letra, dígito ou ‘_’: w Exemplos: ddd ‘000’, ‘012’, ‘321’, ‘999’, ‘821’, ... [a-z]w ‘aa’, ‘ba’, ‘xy’, ‘zh’, ‘a1’, ‘x9’, ‘m_’... [A-Z]dd ‘B12’, ‘P36’, ‘X89’, ...
  • 13.
    Exemplos mais realistas Nome (ex: 'Luciana') [A-Z][a-z]* Hora (ex: '12:34') dd:dd Nome de variável (ex: 'minha_var_2') w+
  • 14.
  • 15.
    Como funcionam Classesde caracteres Espaço em branco: s Conjunto de possibilidades: [ ] Qualquer caractere: . Exemplos: as*b ‘ab’, ‘a b’, ‘a b’, ‘a b’, ... var[XYZ] ‘varX’, ‘varY’, ‘varZ’ 1. ‘1a’, ‘12’, ‘1;’, ‘1$’, ‘1~’, ... .* qualquer coisa que caiba em uma linha!
  • 16.
    Como funcionam Classesde negação Tudo que não for dígito: D Tudo que não for letra, dígito ou ‘_’: W Tudo que não for espaço em branco: S Tudo que não estiver no conjunto: [^ ] Exemplos: ddD ‘12b’, ‘99/’, ‘23 ’, ... [^abc]+ ‘d’, ‘ef’, ‘xyzdef’, ‘123’, ‘[]{}()’, ...
  • 17.
    Como funcionam Operador“ou” | Exemplos: abc|xyz ‘abc’, ‘xyz’ a|d ‘a’, ‘1’, ‘2’, ‘3’,... a|x|2|5: o mesmo que [ax25]
  • 18.
    Grupos Agrupam trechosde strings Úteis para: Extrair partes interessantes da string Substituir texto
  • 19.
    Grupos Exemplo: HH:MM dd:dd valida a string Mas podemos fazer mais...
  • 20.
    Grupos Exemplo: 20:32 Não nos interessa muito a string “20:32” Interessam-nos mais as substrings “20” e “32” (dd):(dd) Agrupamos partes da expressão regular Podemos recuperar os grupos usando 1, 2 etc.
  • 21.
  • 22.
    Expressões regulares poraí... Java import java.util.regex.Pattern; String regex = "dd:dd"; Pattern.matches(regex, "12:34") true "uma str aqui".replaceAll("s", "_") "uma_string_aqui"
  • 23.
    Expressões regulares poraí... Python import re regex = r'(dd)/(dd)/(dddd)' match = re.match(regex, '13/04/2011') match.group(0) ‘13/04/2011’ match.group(1) ‘13’ match.group(2) ‘04’ match.group(3) ‘2011’
  • 24.
    Expressões regulares poraí... JavaScript var str = 'JavaScript !'; var regex1 = /w/; str.replace(regex1, '#') '#avaScript !' var regex2 = /w/g; str.replace(regex2, '#') '########## !'
  • 25.
    Expressões regulares poraí... Ruby /abcd/ =~ 'abc4' 0 /abcd/ =~ '0123abc789' 4 /abcd/ =~ '0123456' nil match = /(dd):(dd)/.match('12:34') match[1] '12' match[2] '34'
  • 26.
    Expressões regulares poraí... Ruby 'abcd1234'.gsub(/d/, '-') 'a12b'.gsub(/a(dd)b/, 'ab1') Vejamos no irb...
  • 27.
    Exercícios Extrair DDD,prefixo e terminal de um telefone: “(16) 3202-3934” “16”, “3202”, “3934” Extrair somente dígitos de CPF: “123.456.789-00” “12345678900” Extrair somente as consoantes da frase: “eu sou a luz das estrelas” “slzdsstrls”
  • 28.
    Outros metacaracteres Inícioda string: ^ Fim da string: $ Exemplos: ^function Casa com ‘function’, mas não com ‘f = function() { }’ 42$ Casa com ‘var v = 42’, mas não com ‘var v = 42;’ ^algumPadraoAqui$ Casa somente quando o padrão ocupa a linha inteira
  • 29.
    Outros metacaracteres Fronteirade palavra: b Exemplo: b[A-Za-z]+b Casa com todas as palavras de um arquivo
  • 30.
    Mais quantificadores... {exato} d{7} números com exatamente 7 dígitos {minimo,maximo} [a-z]{5,8} 5 a 8 letras minúsculas {minimo,} [A-Z]{3,} 3 ou mais letras maiúsculas
  • 31.
    Mais aplicações... grep svn st | grep –E '.*j(ava|s)' Endereço IP d{1,3}.d{1,3}.d{1,3}.d{1,3}
  • 32.
    Mais aplicações... Horário– versão mais precisa ([01][0-9]|2[0-3]):([0-5][0-9]) Nome de variável – versão mais precisa [A-Za-z_$][w$]*
  • 33.
    Mais aplicações... EndereçoIP – versão radical (25[0-5]|2[0-4][0-9]|[01]?[0- 9][0-9]?).(25[0-5]|2[0-4][0- 9]|[01]?[0-9][0-9]?).(25[0- 5]|2[0-4][0-9]|[01]?[0-9][0- 9]?).(25[0-5]|2[0-4][0- 9]|[01]?[0-9][0-9]?)
  • 34.
    Referências Documentação Python http://docs.python.org/release/2.7/library/re.html? highlight=regex#regular-expression-syntax Documentação Java http://download.oracle.com/javase/1.4.2/docs/api/j ava/util/regex/Pattern.html
  • 35.
    Referências Regular-Expressions.info (possuitutorial) http://www.regular-expressions.info/ Crucial Concepts Behind Advanced Regular Expressions http://www.smashingmagazine.com/2009/05/06/in troduction-to-advanced-regular-expressions/ Visualizador de expressões regulares http://strfriend.com/
  • 36.
    Apêndice Ideias parafuturos temas JPA – Java Persistence API Tratamento de exceções Desenvolvimento para iPhone / Android jQuery