delphi conference 2011 - desmistificando as expressões regulares

39
Desmistificando as Expressões Regulares Mário Guedes

Upload: mario-guedes

Post on 13-Jun-2015

2.828 views

Category:

Technology


4 download

DESCRIPTION

Slide de apoio à palestra sobre Expressões Regulares no Delphi.

TRANSCRIPT

Page 1: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Desmistificando as Expressões

Regulares

Mário Guedes

Page 2: Delphi Conference 2011 - Desmistificando as Expressões Regulares

O que é Expressão Regular?

É uma poderosa ferramenta para manipulação de texto.

“Tão simples quanto um comando de busca e tão poderoso quanto uma linguagem de programação.”

Jeffrey E. F. Friedl

Seus conceitos remontam a década de 40, em um estudo sobre o funcionamento dos neurônios.

Page 3: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Para que serve a Expressão Regular?

Há vários usos possíveis, sendo alguns exemplos:

• Validação de entrada – e-Mail

– Endereço IP

– URL

– Data

– Telefone

• Análise de log

• Validação de estrutura XML

• Busca e substituição de texto

Page 4: Delphi Conference 2011 - Desmistificando as Expressões Regulares

A Expressão Regular está mais próxima do que você imagina!

Várias ferramentas oferecem o uso da Expressão Regular para localização e substituição de texto, inclusive o Delphi.

Page 5: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Expressão Regular é simples!

• Para aplicar uma Expressão Regular, precisamos de três elementos:

– O padrão a ser buscado, que é a Expressão Regular propriamente dita;

– O texto a ser analisado, que basicamente é uma string, com ou sem quebra de linhas;

– Os modificadores, que são sinalizações para a máquina RegEx, que influencia no comportamento dela.

Page 6: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Match: Combinação

• O objetivo de se aplicar uma Expressão Regular a um texto é justamente verificar as combinações;

• Um texto pode conter várias combinações;

• Uma combinação pode ter vários grupos;

Page 7: Delphi Conference 2011 - Desmistificando as Expressões Regulares

A Expressão Regular

As Expressões Regulares são montadas a partir de pequenas unidades de blocos de montagens:

• Meta-caractere – São os caracteres com funções especiais dentro da Expressão Regular

• Caractere literal – Não tem função especial na Expressão Regular

Page 8: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Modificadores

• Podemos modificar o comportamento da máquina da Expressão Regular com os modificadores.

Modificador Aplicação

roNone Sem utilização prática

roIgnoreCase Ignora maiúscula e minúscula

roMultiLine Indica ao mecanismo que a string possui várias linhas, influenciando no resultado do ^ e $

roExplicitCapture Os grupos somente serão capturados se forem nomeados

roCompiled Agiliza futuras pesquisas

roSingleLine Indica ao mecanismo para tratar a string como uma linha só, influenciando na combinação do ponto, que passa a considerar o #13

roIgnorePatternSpace Na prática, habilita comentários na Expressão Regular

Page 9: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Usando tudo isto no Delphi

• O verdadeiro poder da RegEx se mostra quando usado em conjunto com uma liguagem hospedeira;

• Desde o Delphi XE está disponível a unit RegularExpressions, que contêm os tipos necessários para tirar proveito das Expressões Regulares;

• Pertence ao “sabor” PCRE: Expressão Regular compatível com Perl;

• Para as versões anteriores do Delphi, é possível usar uma biblioteca disponível em: http://www.regular-expressions.info/delphi.html

Page 10: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Tipo TRegEx

• TRegEx é um record e não uma classe;

• Contêm os métodos para a aplicação de uma Expressão Regular em uma string;

• Os métodos mais usuais são:

– IsMatch

– Match

– Matches

– Replace

Page 11: Delphi Conference 2011 - Desmistificando as Expressões Regulares

TRegEx.IsMatch

• É o método mais direto, útil para validações simples.

Input: Texto a ser

analisado

Pattern: A RegEx a ser

aplicada

Options: Conjunto de

modificadores

Page 12: Delphi Conference 2011 - Desmistificando as Expressões Regulares

TRegEx.Replace

• Substitui os trechos combinados com a Expressão Regular por um outro texto.

Input: Texto a ser analisado

Pattern: A RegEx a ser

aplicada

Replacement: Texto que substituirá

Options: Conjunto de

modificadores

Page 13: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Dica:

• Interprete a RegEx de uma forma literal.

• Início de linha, seguido por

• X, seguido por,

• E, seguido por,

• 2

^XE2

Page 14: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Os meta-caracteres

• A seguir, será mostrado várias possibilidades na construção de uma Expressão Regular;

• Apesar de ser bem abrangente não encerra o assunto. A Expressão Regular é um aprendizado constante;

• Espero que dê tempo e que você não durma...

Page 15: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Os meta-caracteres

• Os meta-caracteres se classificam em:

– Representantes – representam algum caractere, como o ponto ou a lista [...];

– Quantificadores – determinam a quantidade de ocorrências de um átomo da RegEx, como o asterisco;

– Âncoras – combinam com uma posição na string, como o circunflexo e o cifrão;

– Outros – funcionalidades diversas;

Page 16: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Escape: \

• Escapa, ou seja, anula um meta-caractere, tornando-o um caractere literal;

• Também é usado em conjunto com caracteres literais, gerando meta-strings com funções especiais;

www\.

Caractere w, seguido por, w, seguido por, w, seguido por, Caractere ponto literal

w w w . e m b a r c a d e r o . c o m / b r / #13

#10

w w w w

Page 17: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Início de linha: ^

• Combina com o início de uma linha;

• Observe o uso dos modificadores roMultiLine e roSingleLine

^. Início de linha, seguido por Qualquer caractere

L i n h a 1 #13

#10

L i n h a 2 #13

#10

L i n h a 3 roMultiLine

L i n h a 1 #13

#10

L i n h a 2 #13

#10

L i n h a 3 roSingleLine

Page 18: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Fim de linha: $

• Combina com o fim de uma linha;

• Observe o uso dos modificadores roMultiLine e roSingleLine

L i n h a 1 #13

#10

L i n h a 2 #13

#10

L i n h a 3

.$

Qualquer caractere, seguido por, Fim de linha

roMultiLine

L i n h a 1 #13

#10

L i n h a 2 #13

#10

L i n h a 3 roSingleLine

Page 19: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Classe de caracteres: [ ]

• Cria uma classe, ou uma lista de caracteres possíveis em uma posição

X 1 N O N #13

#10

X 2 A B C #13

#10

X 5 X X X

X Literal, seguido por, Caractere 1, ou 2, ou 3

X[123]

Page 20: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Classe com intervalo: [-]

• Determina um intervalo de caracteres (tabela ASCII);

• Único momento em que o traço é um meta-caractere, desde que não seja o primeiro e nem seja precedido por um circunflexo;

X[5-9]

X 1 N O N #13

#10

X 2 A B C #13

#10

X 5 X X X

X Literal, seguido por Qualquer caractere que esteja entre

o 5 e o 9

Page 21: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Classe negada: [^]

• Contêm a lista de caracteres que não pode conter em determinada posição.

• O circunflexo deve ser o primeiro item da lista para ter esta funcionalidade.

X[^5-9]

X 1 N O N #13

#10

X 2 A B C #13

#10

X 5 X X X

• X Literal, seguido por • Qualquer caractere que não esteja

entre o 5 e o 9

Page 22: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Qualquer caractere: .

• É uma abreviação de classe de caracteres que combina com qualquer caractere, inclusive os não imprimíveis.

• Observe a influência do modificador roSingleLine

.

Qualquer caractere

X 1 N O N #13

#10

X 2 A B C #13

#10

X 5 X X X

X 1 N O N #13

#10

X 2 A B C #13

#10

X 5 X X X COM roSingleLine

SEM roSingleLine

Page 23: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Pipe: |

• Permite alternância, podendo haver tantas quantas forem necessárias.

CPF|RG

C , seguido por P, seguido por F

OU R, seguido por G

R G : 9 9 9 9 9 9 9 9 C P F : 0 0 0 0 0 0 0 0

Page 24: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Quantificador opcional: ?

• Torna opcional a existência do elemento predecessor;

• Pode existir ou não o caractere predecessor

XE2?

Caractere X, seguido por, Caractere E, seguido ou não por uma

ocorrência do Caractere 2

O D e l p h i X E 2 é o s u c e s s o r d o X E !

Page 25: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Quantificador de repetição: +

• Tem que existir no mínimo uma ocorrência do elemento predecessor;

\$[0-9]+

• Cifrão literal, seguido por • Caractere de 0 à 9, com uma

ocorrência no mínimo

V a l o r : $ 1 0 0 $ $ $ P R O M O Ç Ã O $ $ $

Page 26: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Quantificador de repetição opcional: *

• O elemento predecessor pode não existir, ou existir em qualquer quantidade;

<B[ ]*>

O < B > D e l p h i < / B > é a m e l h o r < B > I D E < / B >

• Sinal de menor, seguido por • B literal, seguido por • Espaço em qualquer

quantidade, inclusive nenhum, seguido por

• Sinal de maior

Page 27: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Quantificador de intervalo: {min, max}

• Determina uma quantidade exata ou uma quantidade mínima e máxima de ocorrências do elemento predecessor;

10{2,3}

V a l o r : 1 0 V a l o r : 1 0 0 V a l o r : 1 0 0 0 V a l o r : 1 0

• Caractere 1, seguido pelo, • Caractere 0 com duas à três

ocorrências

Page 28: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Agrupamento: (RegEx)

• O agrupamento é o elemento mais versátil, podendo assumir várias funcionalidades.

• A utilização básica é:

(XE2)

O D e l p h i X E 2 e s t a f a n t á s t i c o ! ! !

• Agrupamento: • Caractere X, seguido por, • Caractere E, seguido por, • Caractere 2

Page 29: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Agrupamento com alternância: (opção|opção)

• O agrupamento pode ser utilizado para limitar o escopo de uma alternância.

DELPHI[ ](XE|XE2)

O D e l p h i X E 2 c o m p i l a p a r a 6 4 b i t s !

• Caractere D seguido por, • E, L, P, H, I, seguido por, • Caractere de espaço,

seguido por: • Agrupamento:

• X, seguido por, • E

• OU • X, seguido por, • E, seguido por, • 2

Page 30: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Agrupamento com quantificador: (RegEx)quantificador

• Agrupa múltiplos caracteres em unidades maiores, possibilitando o uso de um quantificador;

• Note que o em caso de alternância é considerado a RegEx e não a combinação.

1(\.000){2}

P r ê m i o : 1 . 0 0 0 . 0 0 0 P r ê m i o : 1 . 0 0 0

• Caractere 1 literal, seguido por, • Duas ocorrências do agrupamento:

• Ponto literal, seguido por, • 0, seguido por, • 0, seguido por, • 0

Page 31: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Agrupamento de captura: \n

• Um agrupamento pode ser referenciado mais à direita na expressão regular, pois o agrupamento “captura” a combinação.

• Na RegEx podem ser feita 9 referências (de 1 a 9)

^(\w*)-\1

a r a r a - a z u l #13

#10

t i c o - t i c o #13

#10

b e i j a - f l o r #13

#10

• Início de linha, seguido por, • Agrupamento:

• Qualquer caractere alfanumérico em qualquer quantidade;

• Caractere de hífen literal, seguido por, • Combinação do grupo 1

Page 32: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Meta-strings:

• Meta-strings são caracteres literais precedidos pela barra invertida.

• Alguns poucos exemplos:

Meta-string Significado ASCII

\t Caractere de tabulação #09

\n Caractere de quebra de linha #13

\r Caractere de retorno de carro #10

\f Caractere de nova página #12

Page 33: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Abreviações de classes de caracteres

• Já são previstas algumas classes de caracteres, onde temos as seguintes abreviações de classes:

Abreviação Abrangência Equivalência

\d Todos os caracteres numéricos [0-9]

\D Todos os caracteres não numéricos [A-Za-z ...]

\s Todos os caracteres não-imprimíveis [\t\n\r ...]

\S Todos os caracteres imprimíveis [A-Za-z0-9 ...]

\w Todos os caracteres que pode compor uma palavra

[a-zA-Z0-9_]

\W Todos os caracteres que não podem compor uma palavra

[!@#$% ...]

Page 34: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Meta-strings de âncoras de limite de palavra

• Marca uma posição imediatamente posterior ou anterior a um caractere de palavra;

• O \B combina com uma posição que não é limite de palavra.

\b\w*\b

C o l u n a 1 C o l u n a 2 C o l u n a 3 C o l u n a 4

• Limite de palavra, seguido por • Qualquer caractere imprimível em

qualquer quantidade, seguido por • Limite de palvra

Page 35: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Meta-string de âncora de início e fim de string

• Para se referir ao início ou a fim da string (independe- mente da existência de quebra de linha) temos as seguintes meta-strings:

Meta-string Significado

\A Início da string

\Z Fim da string

\z Fim da linha

Page 36: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Considerações importantes

• Conhecer bem o texto alvo nos permite moldar uma RegEx mais eficiente;

• Quanto mais específica a RegEx maior a confiabilidade do resultado;

Page 37: Delphi Conference 2011 - Desmistificando as Expressões Regulares

O que não deu tempo de mostrar?

• Soluções relacionadas com UNICODE;

• Problemática dos quantificadores:

– Gananciosos;

– Preguiçosos;

– Possessivos;

• Modificadores de grupo;

• Funcionamento da máquina RegEx;

• Considerações sobre performance;

Page 38: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Perguntas?

• Referências – JARGAS, Aurélio Marinho. Expressões Regulares: Uma

Abordagem Divertida. Novatec Editora.

– FRIEDL, Jeffrey E. F. Dominando Expressões Regulares. Alta Books Editora.

– GOYVAERTS, Jan; LEVITHAN, Steven. Expressões Regulares Cookbook . Novatec Editora.

– http://www.regular-expressions.info/

• A palestra continua em: http://eugostododelphi.blogspot.com/p/expressao-regular.html

• EDN – Embarcadero Developer Network – http://edn.embarcadero.com/br

Page 39: Delphi Conference 2011 - Desmistificando as Expressões Regulares

Obrigado

• José Mário Silva Guedes

– www.tdstecnologiasp.com.br

[email protected]

– @jmarioguedes

• eugostododelphi.blogspot.com

– @eugostododelphi