Escolar Documentos
Profissional Documentos
Cultura Documentos
Esperamos que você compartilhe este material com seus colegas, mas
pedimos a gentileza de não compartilhar na grande web. Futuras atualizações
serão enviadas diretamente ao seu e-mail, jailson.santos@g4solutions.com.br e
por isso solicitamos que mantenha seu cadastro atualizado.
Sobre a arrayOF
Sumário
Esta é a sua cópia pessoal da apostila ...................................................................... 1
Sobre esta apostila ........................................................................................................ 1
Sobre a arrayOF ............................................................................................................. 1
Material de apoio .......................................................................................................... 5
Introdução ...................................................................................................................... 5
Propósito da Expressão Regular................................................................................... 6
Princípios básicos ........................................................................................................ 6
Motor RegEx ................................................................................................................ 7
Utilização no Delphi ................................................................................................... 7
Dominando os meta-caracteres ................................................................................. 9
Ponto: . ....................................................................................................................... 10
Escape: \ ................................................................................................................... 11
Circunflexo: ^ ............................................................................................................ 12
Cifrão: $...................................................................................................................... 13
Pipe: | ........................................................................................................................ 14
Colchetes: [ ] ............................................................................................................. 15
Quantificadores ........................................................................................................ 16
Estrela: * .................................................................................................................. 16
Cruz: + ..................................................................................................................... 18
Interrogação: ? ..................................................................................................... 19
Chaves: {n,n } ........................................................................................................ 20
Ganância versus Preguiça .................................................................................. 21
Quantificador possesivo ...................................................................................... 22
Parênteses: ( ) ........................................................................................................... 24
Agrupamento com alternância: ........................................................................ 24
Agrupamento com quantificador: .................................................................... 25
Referência Anterior: ............................................................................................. 26
Utilização na linguagem hospedeira ................................................................ 27
Modificador de grupo: ............................................................................................ 29
Grupo de não captura: (?: subexpressão) ....................................................... 29
Grupo de comentário: (?# comentário) ......................................................... 30
Grupo nomeado: (?<nome> subexpressão) .................................................... 30
Material de apoio
https://github.com/arrayOF/expressoes_regulares_com_delphi.git
Introdução
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.
Validação de entrada;
o e-Mail;
o Endereço IP;
o URL;
o Data;
o Telefone;
o CPF;
Análise de LOG;
Consistência de arquivo XML;
Busca e substituição de texto;
E qualquer outra solução que envolva texto.
Princípios básicos
Motor RegEx
Utilização no Delphi
eRegEx:
TEdit
fRegEx:
mTexto:
TForm
TMemo
tvResultado:
clbModificador: TTreeView
TCheckListBox
bProcessar: TButton
No decorrer desta apostila esse vai ser o máximo de código que você
irá digitar. É isto mesmo! Voltaremos neste exato trecho para incrementar uma
coisa aqui e outra ali. Mas perceba que você conseguirá criar vários cenários
sem programar em Pascal.
Dominando os meta-caracteres
Ponto: .
Escape: \
Circunflexo: ^
Cifrão: $
Pipe: |
Colchetes: [ ]
Quantificadores
Estrela: *
Cruz: +
Interrogação: ?
Chaves: {n,n }
Mas por que o motor RegEx não parou no primeiro ponto e vírgula no
texto, recuperando “Campo 1;”? Por que pelo fato da estrela ser gananciosa
ele percebeu o primeiro ponto e vírgula e guardou sua posição para voltar
atrás caso ele não encontrasse nenhum outro pela frente ou se o átomo
posterior exigisse isso.
Ganancioso Preguiçoso
* *?
+ +?
? ??
{n,n} {n,n}?
Quantificador possesivo
Parênteses: ( )
Referência Anterior:
<([a-z]*)>.*</\1>
end;
end;
end;
procedure TfRegEx.GrupoEspecifico;
var
_RegEx : TRegEx;
begin
ShowMessage(_RegEx.Match(mTexto.Text,eRegEx.Text,[]).Groups[11].Value)
;
end;
Modificador de grupo:
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
Modificador de RegEx
Aplicativo de estudo
mRegEx:
TMemo tvResultad
o:
TTreeView
mTexto:
TMemo
bProcessar: clbModificad
TButton or:
TCheckListBox
end;
end;
{$ENDREGION}
finally
Screen.Cursor := crDefault;
end;
end;
Listagem 2: Evento OnClick do botão bProcessar
Os modificadores
Esta opção indica que nenhuma opção está marcada. Porém, usá-la
em conjunto com outras opções não as anula. Portanto, não se percebe um
uso prático para este modificador, pois equivale a passar o conjunto vazio.
O que estiver entre esses dois átomos será combinado com maiúsculo
ou minúsculo. Mas se esta regra se aplicar a toda a RegEx você pode usar o
modificador roIgnoreCase.
Por fim, para tirar proveito do valor capturado pelo primeiro grupo
usamos o átomo:
de uma RegEx sem precisar analisar átomo a átomo. Isso é possível com o
modificador roIgnorePatternSpace.
Com isso, você pode quebrar a sua RegEx em linhas e ao final de cada
linha iniciar um comentário com o símbolo de tralha (#).
A primeira observação que devemos fazer sobre os tipos que lidam com
Expressão Regular no Delphi XE2 é que elas não são classes e sim records com
métodos. É importante perceber isso para não fazermos códigos
desnecessários imaginando que devemos necessariamente instanciar estas
supostas classes e consequentemente liberá-las da memória.
Tipo: TRegEx
Método: TRegEx.IsMatch
Método: TRegEx.Escape
Método: TRegEx.Match
Método: TRegEx.Matches
Método: TRegEx.Replace
leRegEx:
TLabeledEdit
leNovoTexto:
TLabeledEdit
bProcessar:
TButton
mTextoOriginal: mNovoTexto:
TMemo TMemo
//Resultado final
mNovoTexto.Text := TRegEx.Replace(sTexto,sRegEx,sNovoTexto);
end;
Listagem 4: Exemplo de utilização do método Replace
Método: TRegEx.Split
Com o método Split conseguimos dividir o texto alvo usando uma RegEx
como separador. Ainda usando o nosso aplicativo de estudo, vamos colocar
mais um botão (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 utilização do Split
Cópia pessoal de:
50 de 68
Jaison Santos | jailson.santos@g4solutions.com.br
Expressões Regulares com Delphi
Tipo: TMatch
Propriedade Propósito
Success Indica que houve sucesso na combinação
Index Posição em que a combinação se inicia no texto
alvo
Length Tamanho do texto que combinou com a RegEx
Value Texto que combinou com a RegEx
Groups Coleção de agrupamentos que fazem parte da
combinação
Método: TMatch.NextMatch
_match := TRegEx.Match(sTexto,sRegEx,[]);
while _match.Success do
begin
mNovoTexto.Lines.Add(_match.Value);
_match := _match.NextMatch;
end;
end;
Listagem 6: Exemplo de utilização do NextMatch
Método: 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 utilização do Result
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;
Tipo: TGroup
Propriedade Propósito
Success Indica o sucesso da combinação pelo agrupamento
Index Indica a posição 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
Pois é. Não bastassem todas as possibilidades que vimos até aqui, eis
que surge a de usarmos uma condição booleana: if..then..else.
O fato é que para o nome a expressão 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 atenção: o grupo de condição pode
resolver este problema:
Interpretação Átomo
Grupo normal com ou sem
(^NOME:)?
ocorrência
Início de grupo modificado (?
Retro referência ao grupo 1 (1)
RegEx para verdadeiro (.*?),
Indicação da parte else |
RegEx para falso (\d*)
Fim de grupo modificado )
Mas pode ser que não desejamos uma combinação, 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:
Abreviações de caracteres
Abreviação Significado
\a Alerta
\b Backspace
\e Escape
\f Alimentador
\n Quebra de linha
\r Retorno de carro
\t Tabulação
horizontal
\v Tabulação
vertical
(0|1|2|3|4|5|6|7|8|9)
Isso não parece agradável de ler nem muito menos de aplicar. Com a
classe de caractere a RegEx passa a ser:
[0123456789]
[0-9]
\d
[abcdefghijklmnopqrstuvwxyzABC ...]
Abreviação Significado
\d Dígito, equivalente à [0-9]
\D Não dígito, equivalente à [^0-9]
\w Caractere de palavra, equivalente à [a-ZA-Z0-9_]
\W Caractere de não palavra, equivalente à [,.!@#$ ...]
\s Caractere de espaço em branco, equivalente à [
\f\n\r\t\v]
\S Caractere não de espaço em branco, equivalente à
[a-zA-Z...]
Com isso, podemos refinar ainda mais a nossa busca sem maiores
obstáculos como tempo e tamanho da RegEx.
POSIX Significado
[:upper:] Letras maiúsculas
[:lower:] Letras minúsculas
[:alpha:] Letras
[:alnum:] Letras e números
[:digit:] Números
[:xdigit:] Números hexadecimais
[:punct:] Sinais de pontuação
[:blank:] Espaço e tabulação
[:space:] Caracteres em branco (espaço, tabulação, retorno de
carro e etc.)
[:cntrl:] Caracteres de controle
[:graph:] Caracteres imprimíveis
[:print:] Caracteres imprimíveis e o espaço
Perceba que uma classe POSIX deve ser usada dentro de uma classe
de caracteres maior, como no exemplo abaixo:
A solução mais segura para trabalhar com caracteres que não estão na
tabela ASCII básica é utilização da tabela Unicode (http://www.unicode.org).
Meta- Significado
string
\p{L} Símbolos considerados letras.
\p{Lu} – Símbolos considerados letras maiúsculas
\p{Ll} – Símbolos considerados letras minúsculas
\p{M} Símbolos que devem vir sobre outro caractere base, como
acento.
\p{Z} Símbolos de separação, mas sem representação visual
(espaço).
\p{S} Símbolos diversos como cifrão e trema.
\p{N} Símbolos que representam números.
\p{P} Símbolos que representam pontuação como exclamação e
interrogação.
\p{C} Símbolos diversos.
Figura 11: Texto colocado a partir do MS Excel e uma RegEx que não combina
Meta- Objetivo
String
^ Combina com o início 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 início 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 não borda de palavra.