minicurso de expressões regulares
DESCRIPTION
Minicurso de Expressões Regulares ministrado na Dextra, em abril de 2011.TRANSCRIPT
([01][0([01][0 --9]|2[09]|2[0 --3]):([03]):([0 --5][05][0 --9])9])
Expressões RegularesExpressões Regulares
AndrAndréé WillikWillik ValentiValenti
DextraDextra SistemasSistemas
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:� \d\d\d � ‘000’, ‘012’, ‘321’, ‘999’, ‘821’, ...� [a-z]\w � ‘aa’, ‘ba’, ‘xy’, ‘zh’, ‘a1’, ‘x9’, ‘m_’...� [A-Z]\d\d � ‘B12’, ‘P36’, ‘X89’, ...
Exemplos mais realistas
� Nome (ex: 'Luciana')� [A -Z][a -z]*
� Hora (ex: '12:34')� \d\d: \d\d
� 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:� a\s*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:� \d\d\D � ‘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� \d\d:\d\d 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”
� (\d\d):(\d\d)� 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 = "\\d\\d:\\d\\d";
� Pattern. matches(regex, "12:34")� true
� "uma str aqui".replaceAll("\\s", "_")� "uma_string_aqui"
Expressões regulares por a í...
� Python� import re
� regex = r'(\d\d)/(\d\d)/(\d\d\d\d)'
� 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� /abc\d/ =~ 'abc4' � 0
� /abc\d/ =~ '0123abc789' � 4
� /abc\d/ =~ '0123456' � nil
� match = /(\d\d):(\d\d)/.match('12:34')
� match[1] � '12'
� match[2] � '34'
Expressões regulares por a í...
� Ruby� 'abcd1234'.gsub(/\d/, '-')
� 'a12b'.gsub(/a(\d\d)b/, 'ab\1')
� 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