... Assinatura do site por 3 anos + Kit MontaRibbons + 3 Livros em PDF + Diversas Revistas (pdf) de brinde, por apenas R$182,00
(
podendo parcelar em até 10 vezes no cartão de crédito)...

Clique aqui e obtenha mais detalhes do nosso kit completo e de como comprar.


Expressões Regulares no Microsoft Access

Saber utilizar Expressões Regulares no Access, geralmente nos livra de ter que criar códigos mirabolantes e com isso nos poupa um enorme tempo de programação. As Expressões Regulares são utilizadas, basicamente, para se obter determinada sequência de caracteres dentro de um texto ou para validar uma entrada de informação.    

Por exemplo, vamos supor que precisemos extrair os números contidos na seguinte frase:

"O Brasil perdeu de 7 x 1 para a Alemanha em 2014"

Pense aí qual seria a programação utilizada por você, para extrair esses números (7, 1 e 2014) . Com a função oferecida aqui no artigo, resolvemos a questão com pouquíssimas linhas. Veja!

Dim strTexto$
Dim varResultado as Variant 
strTexto = "O Brasil perdeu de 7 x 1 para a Alemanha em 2014"
varResultado = fncER(strTexto,"\d+",false)

A função fncER() irá retornar os números, separados por uma barra vertical 7|1|2014

Observe que \d+ é a nossa expressão.  Expressão é um conjunto de caracteres sequenciados que determina a regra a ser aplicada na busca.  A interpretação de \d+ é: - buscar números de qualquer tamanho na string.

Agora, vamos supor que precisemos validar um campo de entrada de senha.  A senha deve ter, obrigatoriamente, o comprimento de 6 caracteres e pelo menos um número.  Observe com atenção, a expressão em vermelho, aplicada na função:

Private Sub txtSenha_BeforeUpdate(Cancel As Integer)
If fncER(me!txtSenha,"^(?=.*\d).{6}$", true) = false then
   MsgBox "A senha não atende as regras...", vbInformation, "Aviso"
   cancel = true
End If
End Sub

Interpretação da expressão utilizada, para atender as regras propostas:

^  Início da cadeia
(?=.*\d)  Ao menos um número na cadeia
.{6}  Cadeia com 6 caracteres obrigatórios
$  Fim da cadeia

 

Se a senha digitada pelo usuário não contiver os 6 caracteres e ao menos um número, a função fncER() retornará o valor FALSE, impedindo assim, o prosseguimento no cadastro.

Quer aprender tudo sobre Expressões Regulares ?

Há um excelente livro disponível em Português, basta acessar gratuitamente o link abaixo:

http://aurelio.net/regex/guia/

Neste outro link, o autor do livro, oferece dois vídeos interessantes:

http://www.piazinho.com.br

Aonde posso testar as Expressões Regulares ?

Existem vários sites disponíveis para esta finalidade.  Seguem dois deles:

https://www.regex101.com

http://www.regexpal.com

Há algum lugar com exemplos ?

Sim, você irá encontrar centenas de expressões exemplos, no seguinte site:

http://www.regexlib.com

Nossa função

Copie e cole a função abaixo para um módulo global do seu projeto. Atente para os comentários

Function fncER(strTexto As String, _
strRgx As String, _
blnTeste As Boolean, _
Optional blnPrimeiro As Boolean) As Variant
'-----------------------------------------
'Argumentos da função
'------------------------------------------
'strTexto - String a ser analisada
'strRgx - Expressão
'blnTeste - Se true, testa se a string obedece as regras da expressão aplicada
'blnTeste - Se false, extrai valores da string, conforme expressão aplicada
'blnPrimeiro - Se true, extrai apenas o primeiro valor encontrado na string, conforme expressão aplicada
'---------------------------------------------------------------------------------------------------------

Dim RegEx As Object
Dim MatchCollection As Object
Dim Match
Dim Resultado As String
On Error Resume Next
'Carrega Expressões Regulares do vbScript
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
    .Global = True
    .IgnoreCase = False
    .Pattern = strRgx 'aqui entra a expressão
    If blnTeste Then
        'função retorna se a string é válida ou não
        fncER = .Test(strTexto)
    Else
        Set MatchCollection = .Execute(strTexto)
        If MatchCollection.Count <> 0 Then
            For Each Match In MatchCollection
                Resultado = Resultado & "|" & Match.Value
                If blnPrimeiro Then Exit For
            Next
        End If
        'função retorna valores, separados pelo traço vertical "|"
        fncER = Mid(Resultado, 2)
    End If
End With
Set RegEx = Nothing
End Function

Mais alguns exemplos de como podemos usar nossa função:

1) - O exemplo abaixo obtém os dados da seguinte XML:

<nome>Avelino</nome><telefone>8277-1528</telefone><cep>20570110</cep>

Veja que em poucas linhas conseguimos extrair as informações desejadas:

Dim strXml as string
Dim varResultado
strXml="<nome>Avelino</nome><telefone>8277-1528</telefone><cep>20570110</cep>"
resultado = fncER(strXml,">([^>|<].*?)<",False)
resultado = fncER(resultado,"[^<|>]+",False)
MsgBox Resultado, vbInformation, "Aviso"

Note que a fncER() foi utilizada por duas vezes.  Na primeira vez, a expressão utilizada na função não conseguiu extrair os dados de forma limpa, trazendo as partes indesejáveis em vermelho:

>Avelino<|>8277-1528<|>20570110<

Na segunda aplicação da função, a expressão utilizada retirou a parte indesejável, retornando apenas com os dados.

Avelino|8277-1528|20570110

Desafio: Tente extrair os dados, criando apenas uma expressão e caso tenha êxito, informe aqui nos comentários deste artigo.

2) - O código abaixo, verifica se o usuário digitou um e-mail válido.

Dim strExpressão$
strExpressão = "^([a-zA-Z0-9_\-\.]+)@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$"
If fncER(me!Email, strExpressão, true) = False then
   MsgBox "O e-mail não foi digitado corretamente...", vbInformation, "Aviso"
   Cancel = true
end If

Interpretação da expressão utilizada, para atender as regras propostas:

^ Início da cadeia
([a-zA-Z0-9_\-\.]+) Permite nomes utilizando letras maiúsculas, minúsculas, o underline, o traço e o ponto.  O uso do + significa que temos que ter ao menos um caractere neste conjunto.  Ex: a@...
@ Arroba obrigatório
[a-z0-9-]+ Permite as letras minúsculas, os números e os traços, junto ao arroba.   O uso do + significa que temos que ter ao menos um caractere neste conjunto.  Ex: a@b...
(\.[a-z0-9-]+)* Permite um ponto seguido de letras minúsculas, de números e de traços.  O asterisco indica que podemos não ter esta parte. Ex: a@b.com ou a@b
(\.[a-z]{2,3}) Permite um ponto seguido de 2 ou 3 letras minúsculas.  Ex. a@b.com.br ou a@b.com
$ Final da cadeia


Resuminho dos Metacaracteres utilizados nas Expressões Regulares:

Metacaractere Nome Função
. Ponto Um caractere qualquer
[...] Lista Lista de caracteres permitidos
[^...] Lista negada Lista de caracteres proibidos
? Opcional Zero ou um
* Asterisco Zero, um ou mais
+ Mais Um ou mais
{n,m} Chaves De n a m
^ Circunflexo Início da linha
$ Cifrão Fim da linha
\b Borda Início ou fim da palavra
\ Escape \c - Torna literal o caractere c
| Ou Ou um ou outro
(...) Grupo Delimita um grupo
\1 ... \9 Retrovisor Texto casado nos grupos 1...9
     
\d   Dígito
\D   Não-dígito
\w   Palavra
\W   Não palavra
\s   Brancos
\S   Não brancos
     
(?#texto)   Texto é um comentário
(?:ER)   Grupo fantasma, retrovisor não conta
(?=ER)   Casa se ER casar adiante
(?<=ER)   Casa se ER casar antes
(?!ER)   Casa se ER não casar adiante
(?<!ER)   Casa se ER não casar antes

 

Baixe o arquivo e faça o teste:

Clique aqui e baixe o arquivo exemplo.

Abra a consulta qryTeste e veja que os campos Data Inscrição e Inscrição são dados extraídos do campo Descrição.Consulta

Abra a estrutura da consulta e veja a função fncER() sendo aplicada para extrair os dados.  Analise as expressões utilizadas.

Estrutura consula

Agora, abra o formulário frmTeste.

- Simule e-mails escritos de forma equivocada e veja o resultado. 

- Entre com uma senha sem respeitar as regras estabelecidas e veja o resultado.

Formulário

Desafio: Tente criar códigos para validar os dois campos do formulário, sem usar as Expressões Regulares.  Conclua se é vantagem ou desvantagem saber utilizar as Expressões Regulares no Access.


Sucesso!


 

 


12 comentários

Antonio Carlos   16/10/2016 20:45:00

Mestre Avelino

Mais um GOOLLL de placa. Até aonde podemos ir com esse Access, hem ?!


Evanildo Conceição   16/10/2016 22:08:46

Avelino, sempre nos surpreendendo. Meus parabéns!

silvio   17/10/2016 06:41:01

Oxi que maneiro.. Parabéns

Cleber Ribeiro   17/10/2016 13:52:35

Meus parabéns, Já estou esperando o que vem mais por aí!! Muito bom!!

Carvalho   17/10/2016 23:36:08

Você sempre surpreendendo não é Avelino, parabéns pelo ótimo post.

Henrique Rodrigues   18/10/2016 10:22:27

Obrigado pelas DICAS!!!
Abcs!!

Marcio Melo - RJ   18/10/2016 13:53:55

Super dica! Muita vantagem utilizar dessas expressões para validar ou extrair parte de um texto para exibir ou alimentar uma determinada coluna...

Sou mais Brasil!

Forte abraço!

Tiago Nascimento   29/10/2016 00:22:09

Excelente postagem sobre Expressões Regulares, pois o professor na faculdade, deu essa aula apenas como uma leitura, sem mostrar como está no post ai. Não tinha o conhecimento que era assim que se programava para se obter o resultado das expressões regulares.

Fabio Paes   05/12/2016 13:20:27

Excelente material meu amigo.

Uma Duvida:
Na tentativa de extrair somente o Texto ( SoTexto: fncER([descrição];"[aA-zZ+\s]";Falso) )

Ele retorna o Resultado assim: ( R|e|g|i|s|t|r|a|d|o| |e|m| | |c|o|m| |o| |n|m|e|r|o| ) Qual a forma correta de extrair somente o Texto? pois dessa forma ele traz vários | , sei que com REPLACE() resolveria... Mas tem uma forma mais correta pra extrair somente o Texto?

Anisio Estevao   06/12/2016 17:23:30

Amigo, Boa tarde!

Tentei executar os comando conforme o tutorial, mas apareceu uma mensagem de erro

Você poderia disponibilizar o arquivo ?
Meu e-mail é anisioestevao@terra.com.br

Avelino Sampaio   08/12/2016 06:21:39

Fabio,

creio que fique mais acertado se retirar os números. Como esta fazendo corre o risco de não retornar com os acentos.

SoTexto: fncER([descrição];"[^0-9/]+";Falso)

Ainda assim irá retornar com dois |. use então o replace

SoTexto: Substituir(fncER([descrição];"[^0-9/]+";Falso);"|";"")

Sucesso!

MARCIO MELO -RJ   13/09/2017 07:05:05

Muito Showww! Utilizar de expressão regular para analisar um email, nem se compara com o código em VBA para fazer o mesmo teste. Legal que pode fazer vários testes dentro da mesma ideia, pois, a extrutura de usar o VbSript já está montada.

Conhecimento é tudo, parabéns e obrigado por levar mais esse artigo de forma super didática como sempre...

Forte abraço!

Sou mais Brasil!


Envie o seu comentário: