Post on 13-Jun-2015
description
Desmistificando as Expressões
Regulares
Mário Guedes
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.
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
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.
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.
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;
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
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
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
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
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
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
Dica:
• Interprete a RegEx de uma forma literal.
• Início de linha, seguido por
• X, seguido por,
• E, seguido por,
• 2
^XE2
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...
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;
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
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
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
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]
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
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
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
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
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 !
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 $ $ $
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
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
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
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
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
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
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
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
[!@#$% ...]
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
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
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;
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;
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
Obrigado
• José Mário Silva Guedes
– www.tdstecnologiasp.com.br
– jmarioguedes@gmail.com
– @jmarioguedes
• eugostododelphi.blogspot.com
– @eugostododelphi