Академический Документы
Профессиональный Документы
Культура Документы
Sobre a arrayOF
1 de 68
Expresses Regulares com Delphi
Sumrio
Esta a sua cpia pessoal da apostila ...................................................................... 1
Sobre esta apostila ........................................................................................................ 1
Sobre a arrayOF ............................................................................................................. 1
Material de apoio .......................................................................................................... 5
Introduo ...................................................................................................................... 5
Propsito da Expresso Regular................................................................................... 6
Princpios bsicos ........................................................................................................ 6
Motor RegEx ................................................................................................................ 7
Utilizao no Delphi ................................................................................................... 7
Dominando os meta-caracteres ................................................................................. 9
Ponto: . ....................................................................................................................... 10
Escape: \ ................................................................................................................... 11
Circunflexo: ^ ............................................................................................................ 12
Cifro: $...................................................................................................................... 13
Pipe: | ........................................................................................................................ 14
Colchetes: [ ] ............................................................................................................. 15
Quantificadores ........................................................................................................ 16
Estrela: * .................................................................................................................. 16
Cruz: + ..................................................................................................................... 18
Interrogao: ? ..................................................................................................... 18
Chaves: {n,n } ........................................................................................................ 19
Ganncia versus Preguia .................................................................................. 21
Quantificador possesivo ...................................................................................... 22
Parnteses: ( ) ........................................................................................................... 24
Agrupamento com alternncia: ........................................................................ 24
Agrupamento com quantificador: .................................................................... 25
Referncia Anterior: ............................................................................................. 26
Utilizao na linguagem hospedeira ................................................................ 27
Modificador de grupo: ............................................................................................ 29
Grupo de no captura: (?: subexpresso) ....................................................... 29
Grupo de comentrio: (?# comentrio) ......................................................... 30
Grupo nomeado: (?<nome> subexpresso) .................................................... 30
2 de 68
Expresses Regulares com Delphi
3 de 68
Expresses Regulares com Delphi
4 de 68
Expresses Regulares com Delphi
Material de apoio
https://github.com/arrayOF/expressoes_regulares_com_delphi.git
Introduo
E perceba que voc levar este aprendizado, tal qual como voc ver
aqui, para outras linguagens com as quais eventualmente voc vier a
trabalhar, como Python ou JavaScript.
5 de 68
Expresses Regulares com Delphi
Validao de entrada;
o e-Mail;
o Endereo IP;
o URL;
o Data;
o Telefone;
o CPF;
Anlise de LOG;
Consistncia de arquivo XML;
Busca e substituio de texto;
E qualquer outra soluo que envolva texto.
Princpios bsicos
6 de 68
Expresses Regulares com Delphi
Motor RegEx
Utilizao no Delphi
7 de 68
Expresses Regulares com Delphi
eRegEx:
TEdit
fRegEx:
mTexto:
TForm
TMemo
tvResultado:
clbModificador: TTreeView
TCheckListBox
bProcessar: TButton
No decorrer desta apostila esse vai ser o mximo de cdigo que voc
ir digitar. isto mesmo! Voltaremos neste exato trecho para incrementar uma
coisa aqui e outra ali. Mas perceba que voc conseguir criar vrios cenrios
sem programar em Pascal.
8 de 68
Expresses Regulares com Delphi
Dominando os meta-caracteres
9 de 68
Expresses Regulares com Delphi
Ponto: .
10 de 68
Expresses Regulares com Delphi
Escape: \
11 de 68
Expresses Regulares com Delphi
Circunflexo: ^
12 de 68
Expresses Regulares com Delphi
Cifro: $
13 de 68
Expresses Regulares com Delphi
Pipe: |
14 de 68
Expresses Regulares com Delphi
Colchetes: [ ]
15 de 68
Expresses Regulares com Delphi
Quantificadores
Estrela: *
16 de 68
Expresses Regulares com Delphi
17 de 68
Expresses Regulares com Delphi
Cruz: +
Interrogao: ?
18 de 68
Expresses Regulares com Delphi
Chaves: {n,n }
19 de 68
Expresses Regulares com Delphi
20 de 68
Expresses Regulares com Delphi
Ganancioso Preguioso
* *?
+ +?
? ??
{n,n} {n,n}?
21 de 68
Expresses Regulares com Delphi
Quantificador possesivo
22 de 68
Expresses Regulares com Delphi
23 de 68
Expresses Regulares com Delphi
Parnteses: ( )
24 de 68
Expresses Regulares com Delphi
25 de 68
Expresses Regulares com Delphi
Referncia Anterior:
<([a-z]*)>.*</\1>
26 de 68
Expresses Regulares com Delphi
27 de 68
Expresses Regulares com Delphi
begin
oNode := tvResultado.Items.Add(nil,_Matche.Value);
tvResultado.Items.AddChild(oNode,Format('Index:
%d',[_Matche.Index]));
tvResultado.Items.AddChild(oNode,Format('Length:
%d',[_Matche.Length]));
end;
end;
end;
28 de 68
Expresses Regulares com Delphi
procedure TfRegEx.GrupoEspecifico;
var
_RegEx : TRegEx;
begin
ShowMessage(_RegEx.Match(mTexto.Text,eRegEx.Text,[]).Groups[11].Value)
;
end;
Modificador de grupo:
29 de 68
Expresses Regulares com Delphi
30 de 68
Expresses Regulares com Delphi
procedure TfRegEx.GrupoEspecifico;
var
_RegEx : TRegEx;
begin
ShowMessage(_RegEx.Match(mTexto.Text,eRegEx.Text,[]).Groups['DDD'].
Value);
end;
Listagem 3: Exemplo de retorno do valor de um grupo pelo ndice nomeado
31 de 68
Expresses Regulares com Delphi
32 de 68
Expresses Regulares com Delphi
Modificador de RegEx
Aplicativo de estudo
mRegEx:
TMemo tvResultad
o:
TTreeView
mTexto:
TMemo
bProcessar: clbModificad
TButton or:
TCheckListBox
33 de 68
Expresses Regulares com Delphi
34 de 68
Expresses Regulares com Delphi
end;
end;
{$ENDREGION}
finally
Screen.Cursor := crDefault;
end;
end;
Listagem 2: Evento OnClick do boto bProcessar
35 de 68
Expresses Regulares com Delphi
Os modificadores
Esta opo indica que nenhuma opo est marcada. Porm, us-la
em conjunto com outras opes no as anula. Portanto, no se percebe um
uso prtico para este modificador, pois equivale a passar o conjunto vazio.
O que estiver entre esses dois tomos ser combinado com maisculo
ou minsculo. Mas se esta regra se aplicar a toda a RegEx voc pode usar o
modificador roIgnoreCase.
36 de 68
Expresses Regulares com Delphi
37 de 68
Expresses Regulares com Delphi
Por fim, para tirar proveito do valor capturado pelo primeiro grupo
usamos o tomo:
38 de 68
Expresses Regulares com Delphi
Com isso, voc pode quebrar a sua RegEx em linhas e ao final de cada
linha iniciar um comentrio com o smbolo de tralha (#).
39 de 68
Expresses Regulares com Delphi
40 de 68
Expresses Regulares com Delphi
41 de 68
Expresses Regulares com Delphi
42 de 68
Expresses Regulares com Delphi
43 de 68
Expresses Regulares com Delphi
A primeira observao que devemos fazer sobre os tipos que lidam com
Expresso Regular no Delphi XE2 que elas no so classes e sim records com
mtodos. importante perceber isso para no fazermos cdigos
desnecessrios imaginando que devemos necessariamente instanciar estas
supostas classes e consequentemente liber-las da memria.
44 de 68
Expresses Regulares com Delphi
Tipo: TRegEx
45 de 68
Expresses Regulares com Delphi
Mtodo: TRegEx.IsMatch
Mtodo: TRegEx.Escape
46 de 68
Expresses Regulares com Delphi
Mtodo: TRegEx.Match
Mtodo: TRegEx.Matches
Mtodo: TRegEx.Replace
47 de 68
Expresses Regulares com Delphi
leRegEx:
TLabeledEdit
leNovoTexto:
TLabeledEdit
bProcessar:
TButton
mTextoOriginal: mNovoTexto:
TMemo TMemo
//Resultado final
mNovoTexto.Text := TRegEx.Replace(sTexto,sRegEx,sNovoTexto);
end;
Listagem 4: Exemplo de utilizao do mtodo Replace
48 de 68
Expresses Regulares com Delphi
49 de 68
Expresses Regulares com Delphi
Mtodo: TRegEx.Split
Com o mtodo Split conseguimos dividir o texto alvo usando uma RegEx
como separador. Ainda usando o nosso aplicativo de estudo, vamos colocar
mais um boto (bSplit) e codificar como segue:
mNovoTexto.Clear;
aResultado := TRegEx.Split(sTextoAlvo, sSeparador);
for sItem in aResultado do
begin
mNovoTexto.Lines.Add(sItem);
end;
end;
Listagem 5: Exemplo de utilizao do Split
50 de 68
Expresses Regulares com Delphi
Tipo: TMatch
Propriedade Propsito
Success Indica que houve sucesso na combinao
Index Posio em que a combinao se inicia no texto
alvo
Length Tamanho do texto que combinou com a RegEx
Value Texto que combinou com a RegEx
Groups Coleo de agrupamentos que fazem parte da
combinao
Mtodo: TMatch.NextMatch
51 de 68
Expresses Regulares com Delphi
_match := TRegEx.Match(sTexto,sRegEx,[]);
while _match.Success do
begin
mNovoTexto.Lines.Add(_match.Value);
_match := _match.NextMatch;
end;
end;
Listagem 6: Exemplo de utilizao do NextMatch
52 de 68
Expresses Regulares com Delphi
Mtodo: TMatch.Result
sRegEx := leRegEx.Text;
sTexto := mTextoOriginal.Text;
sFormato := leNovoTexto.Text;
_match := TRegEx.Match(sTexto,sRegEx,[]);
while (_match.Success) do
begin
mNovoTexto.Lines.Add(_match.Result(sFormato));
_match := _match.NextMatch;
end;
end;
Listagem 7: Exemplo de utilizao do Result
53 de 68
Expresses Regulares com Delphi
Tipo: TMatchCollection
_collection := TRegEx.Matches(sAlvo,sRegEx,[]);
if (_collection.Count > 0) then
begin
for i := 0 to Pred(_collection.Count) do
begin
mNovoTexto.Lines.Add(_collection.Item[i].Value);
end;
end;
end;
_collection := TRegEx.Matches(sAlvo,sRegEx,[]);
if (_collection.Count > 0) then
begin
for _match in _collection do
begin
mNovoTexto.Lines.Add(_match.Value);
end;
end;
end;
54 de 68
Expresses Regulares com Delphi
Tipo: TGroup
Propriedade Propsito
Success Indica o sucesso da combinao pelo agrupamento
Index Indica a posio do texto combinado pelo agrupamento
no texto alvo
Length Indica o tamanho do texto combinado pelo
agrupamento
Value Indica o texto combinado pelo agrupamento
Tipo: TGroupCollection
55 de 68
Expresses Regulares com Delphi
O fato que para o nome a expresso poderia ser algo parecido com
(.*?), enquanto que para a idade o mais adequado (\d*). A primeira
possibilidade que nos surge fazermos dois processamentos individuais. E
para este fato que quero chamar a ateno: o grupo de condio pode
resolver este problema:
56 de 68
Expresses Regulares com Delphi
Interpretao tomo
Grupo normal com ou sem
(^NOME:)?
ocorrncia
Incio de grupo modificado (?
Retro referncia ao grupo 1 (1)
RegEx para verdadeiro (.*?),
Indicao da parte else |
RegEx para falso (\d*)
Fim de grupo modificado )
57 de 68
Expresses Regulares com Delphi
Mas pode ser que no desejamos uma combinao, quando esta for
precedida ou sucedida por um determinado valor. Vamos imaginar uma lista
de nome e sobrenome onde queremos retornar apenas o sobrenome de uma
determinada pessoa:
58 de 68
Expresses Regulares com Delphi
59 de 68
Expresses Regulares com Delphi
60 de 68
Expresses Regulares com Delphi
Abreviaes de caracteres
Abreviao Significado
\a Alerta
\b Backspace
\e Escape
\f Alimentador
\n Quebra de linha
\r Retorno de carro
\t Tabulao
horizontal
\v Tabulao
vertical
(0|1|2|3|4|5|6|7|8|9)
[0123456789]
[0-9]
61 de 68
Expresses Regulares com Delphi
\d
[abcdefghijklmnopqrstuvwxyzABC ...]
Abreviao Significado
\d Dgito, equivalente [0-9]
\D No dgito, equivalente [^0-9]
\w Caractere de palavra, equivalente [a-ZA-Z0-9_]
\W Caractere de no palavra, equivalente [,.!@#$ ...]
\s Caractere de espao em branco, equivalente [
\f\n\r\t\v]
\S Caractere no de espao em branco, equivalente
[a-zA-Z...]
Com isso, podemos refinar ainda mais a nossa busca sem maiores
obstculos como tempo e tamanho da RegEx.
62 de 68
Expresses Regulares com Delphi
63 de 68
Expresses Regulares com Delphi
POSIX Significado
[:upper:] Letras maisculas
[:lower:] Letras minsculas
[:alpha:] Letras
[:alnum:] Letras e nmeros
[:digit:] Nmeros
[:xdigit:] Nmeros hexadecimais
[:punct:] Sinais de pontuao
[:blank:] Espao e tabulao
[:space:] Caracteres em branco (espao, tabulao, retorno de
carro e etc.)
[:cntrl:] Caracteres de controle
[:graph:] Caracteres imprimveis
[:print:] Caracteres imprimveis e o espao
Perceba que uma classe POSIX deve ser usada dentro de uma classe
de caracteres maior, como no exemplo abaixo:
64 de 68
Expresses Regulares com Delphi
65 de 68
Expresses Regulares com Delphi
Meta- Significado
string
\p{L} Smbolos considerados letras.
\p{Lu} Smbolos considerados letras maisculas
\p{Ll} Smbolos considerados letras minsculas
\p{M} Smbolos que devem vir sobre outro caractere base, como
acento.
\p{Z} Smbolos de separao, mas sem representao visual
(espao).
\p{S} Smbolos diversos como cifro e trema.
\p{N} Smbolos que representam nmeros.
\p{P} Smbolos que representam pontuao como exclamao e
interrogao.
\p{C} Smbolos diversos.
66 de 68
Expresses Regulares com Delphi
Figura 11: Texto colocado a partir do MS Excel e uma RegEx que no combina
67 de 68
Expresses Regulares com Delphi
Meta- Objetivo
String
^ Combina com o incio de uma string ou linha, de acordo com
o modificador.
$ Combina com o final de uma string ou linha, de acordo com o
modificador.
\A Combina sempre com o incio de uma string.
\Z Combina sempre com o final de uma string.
\z Combina sempre com o final de uma string.
\b Combina com borda de palavra.
\B Combina com no borda de palavra.
68 de 68