minicurso de expressões regulares

36
([01][0 ([01][0 - - 9]|2[0 9]|2[0 - - 3]):([0 3]):([0 - - 5][0 5][0 - - 9]) 9]) Expressões Regulares Expressões Regulares Andr Andr é é Willik Willik Valenti Valenti Dextra Dextra Sistemas Sistemas

Upload: andre-willik-valenti

Post on 27-May-2015

3.511 views

Category:

Technology


6 download

DESCRIPTION

Minicurso de Expressões Regulares ministrado na Dextra, em abril de 2011.

TRANSCRIPT

Page 1: Minicurso de Expressões Regulares

([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

Page 2: Minicurso de Expressões Regulares

Minicurso ?

� Mote:� Foco no basicão

� Objetivos:� Apresentar assunto de forma prática� Despertar interesse� Dar o pontapé inicial

Page 3: Minicurso de Expressões Regulares

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

Page 4: Minicurso de Expressões Regulares

Para que servem

� Encontrar texto� Processar texto� Substituir texto

Page 5: Minicurso de Expressões Regulares

Aplica ções

� Validação de entradas

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

� Filtragem de resultados em consultas

� (...)

Page 6: Minicurso de Expressões Regulares

Expressões regulares por a í

� URLs� Endereços de e-mail� Datas� Caminhos de arquivo� Trechos de código fonte� (...)

Page 7: Minicurso de Expressões Regulares

Vc já usou e talvez nem saiba!

�SELECT * FROM pessoa WHERE sobrenome LIKE '%Silva%' ;

�ls *. txt

�dir *. sys

Page 8: Minicurso de Expressões Regulares

Como funcionam

� Essência� Casamento de padrões� Quantificadores� Classes de caracteres

Page 9: Minicurso de Expressões Regulares

Como funcionam

� Casamento de padrões� Padrão:

� aro

� Casa com:� aro (posição 0)� caro (posição 1)� Amparo (posição 3)

Page 10: Minicurso de Expressões Regulares

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’

Page 11: Minicurso de Expressões Regulares

Como funcionam

� Exemplos� ab+c � ‘abc’, ‘abbc’, ‘abbbc’...� ab?c � ‘ac’, ‘abc’� ab*c � ‘ac’, ‘abc’, ‘abbc’, ‘abbbc’...

Page 12: Minicurso de Expressões Regulares

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’, ...

Page 13: Minicurso de Expressões Regulares

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+

Page 14: Minicurso de Expressões Regulares

Demonstra ção...

Page 15: Minicurso de Expressões Regulares

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!

Page 16: Minicurso de Expressões Regulares

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’, ‘[]{}()’, ...

Page 17: Minicurso de Expressões Regulares

Como funcionam

� Operador “ou”� |

� Exemplos:� abc|xyz � ‘abc’, ‘xyz’� a|\d � ‘a’, ‘1’, ‘2’, ‘3’,...� a|x|2|5 : o mesmo que [ax25]

Page 18: Minicurso de Expressões Regulares

Grupos

� Agrupam trechos de strings� Úteis para:

� Extrair partes interessantes da string� Substituir texto

Page 19: Minicurso de Expressões Regulares

Grupos

� Exemplo:� HH:MM� \d\d:\d\d valida a string� Mas podemos fazer mais...

Page 20: Minicurso de Expressões Regulares

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.

Page 21: Minicurso de Expressões Regulares

Demonstra ção...

Page 22: Minicurso de Expressões Regulares

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"

Page 23: Minicurso de Expressões Regulares

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’

Page 24: Minicurso de Expressões Regulares

Expressões regulares por a í...

� JavaScript� var str = 'JavaScript !';

� var regex1 = /\w/;

� str.replace(regex1, '#')� '#avaScript !'

� var regex2 = /\w/g;

� str.replace(regex2, '#')� '########## !'

Page 25: Minicurso de Expressões Regulares

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'

Page 26: Minicurso de Expressões Regulares

Expressões regulares por a í...

� Ruby� 'abcd1234'.gsub(/\d/, '-')

� 'a12b'.gsub(/a(\d\d)b/, 'ab\1')

� Vejamos no irb...

Page 27: Minicurso de Expressões Regulares

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”

Page 28: Minicurso de Expressões Regulares

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

Page 29: Minicurso de Expressões Regulares

Outros metacaracteres

� Fronteira de palavra: \b

� Exemplo:� \b[A-Za-z]+\b

� Casa com todas as palavras de um arquivo

Page 30: Minicurso de Expressões Regulares

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

Page 31: Minicurso de Expressões Regulares

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}

Page 32: Minicurso de Expressões Regulares

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$ ]*

Page 33: Minicurso de Expressões Regulares

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]?)

Page 34: Minicurso de Expressões Regulares

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

Page 35: Minicurso de Expressões Regulares

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/

Page 36: Minicurso de Expressões Regulares

Apêndice

� Ideias para futuros temas� JPA – Java Persistence API� Tratamento de exceções� Desenvolvimento para iPhone / Android� jQuery