VBA – Expressões Regulares (Regex)
In this Article
Este tutorial irá demonstrar como utilizar Regex (expressões regulares) em VBA.
O que é Regex?
Regex é uma abreviação em inglês para Regular Expression (Expressão Regular). Uma expressão regular nada mais é do que um padrão construído a partir de uma sequência de caracteres que são utilizados para encontrar um padrão em uma string de caracteres. Para utilizar Regex no VBA você precisa utilizar o objeto RegExp.
Um padrão, como por exemplo, [A-C] pode ser utilizado para procurar uma combinação de letras maiúsculas entre A e C dentro de uma sequencia. Padrões Regex possuem sua própria sintaxe e podem ser construídos usando um caractere ou uma sequencia de caracteres.
Caracteres Correspondentes
A tabela a seguir mostra a sintaxe que lhe permitirá construir padrões Regex.
Sintaxe do Padrão | Descrição | Exemplo | Padrões Encontrados |
---|---|---|---|
. | Coincide o ponto com qualquer caractere único, exceto vbNewLine (caractere de nova linha) | f.n | fan, fon, f@n, fwn |
[caracteres] | Coincide qualquer caractere único dentro dos colchetes [] | [fn] | Coincidiria apenas “f” ou “n” na sequencia “fan” |
[^caracteres] | Coincide qualquer caractere único que não está entre os colchetes [] | [^fn] | Coincidiria apenas “j” em “fjn” |
[inicio-fim] | Coincide qualquer caractere que seja parte do intervalo entre colchetes[] | [1-5] | Coincidiria “4” e “5” em “45” |
\w | Coincide caracteres alfanuméricos e o caractere underline (_), mas não o caractere de espaço | \w | Coincidiria “c” em “,c.” |
\W | Coincide qualquer caractere não-alfanumérico e o caractere underline | \W | Coincidiria “@” em “bb@bb” |
\s | Coincide qualquer caractere de espaço em branco, como o espaço simples e o caracteres de tab (tabulação) | \s | Coincidiria ” ” em “Isto é” |
\S | Coincide qualquer caracteres que não sejam espaço em branco. | \S | Coincidiria “T” e “h” em “T h” |
\d | Coincide qualquer caractere simples de dígito decimal | \d | Coincidiria “7” em “a7h” |
\D | Coincide qualquer caractere simples que não seja dígito decimal | \D | Coincidiria j em “47j” |
\ | Escape para caracteres especiais, o que lhe permite procurar por eles | \. | Coincidiria “.” em “59.pQ” |
\t | Coincide o caracteres de tabulação (vbTab) | \t | Coincidiria o caractere de tabulação (vbTab) |
\r | Coincide o caractere de Retorno de Carro (vbCr) | \r | Coincidiria o caractere de retorno de carro (vbCr) |
\n | Coincide o caractere de Nova Linha (vbNewLine) | \n | Coincidiria o caractere de Nova Linha |
Quantificadores
Você pode utilizar quantificadores para especificar quantas vezes você deseja que o padrão coincida na string.
Quantificador | Descrição | Exemplo | Padrões Encontrados |
---|---|---|---|
* | Encontra zero ou mais ocorrências | fn*a | fna, fa, fnna, fnnna, fnfnnna |
+ | Encontra uma ou mais ocorrências | fn+a | fna, fnna, fnfnna |
? | Encontra zero ou uma ocorrência | fn?a | fa, fna |
{n} | Encontra “n” vezes | d\W{4} | Coincidiria “d….” em “d….&5hi” |
{n,} | Encontra pelo menos “n” vezes ou mais | d\W{4,} | Coincidiria “d….&” em “d….&5hi” |
{n,m} | Encontra pelo menos “n” vezes e no máximo “m” vezes | d\W{1,8} | Coincidiria “d….&&&&” em “d….&&&&5hi” |
Agrupamento
Agrupamento ou captura lhe permite utilizar um padrão para capturar e extrair uma porção de uma string. Então, não somente o padrão é encontrado, mas também parte da string que coincide com o padrão é capturada.
Padrão | Descrição | Exemplo | Padrão Encontrado e Capturado |
---|---|---|---|
(expressão) | Agrupa e captura o padrão entre parêntesis | (\W{4}) | Agrupa e captura “@@@@” de “1@@@@1jlmba” |
Como Utilizar Regex no VBA
Para utilizar Regex no VBA, primeiro é necessário definir a referência no VBE (Visual Basic Editor). No editor VBE, vá em Ferramentas > Referências > Microsoft VBScript Regular Expressions.
Estas são as propriedades do objeto RegExp:
- Pattern – O padrão que você irá utilizar para coincidir em uma string.
- IgnoreCase – Se True (verdadeiro), então o padrão não fará diferenciação entre maiúsculas e minúsculas.
- Global – Se True, então todas as ocorrências do padrão serão encontradas. Se False então somente a primeira ocorrência é encontrada.
- MultiLine – Se True, o padrão será encontrado mesmo que esteja em linhas diferentes.
Estes são os métodos do objeto RegExp:
- Test – Procura por um padrão em uma string e retorna True se uma ocorrência é encontrada.
- Replace – Substitui as ocorrências do padrão pela string de substituição.
- Execute – Retorna as ocorrências do padrão contra a string.
Testando um Padrão para Encontrar Ocorrências em uma String
Você pode utilizar o método Test para checar se um padrão encontra ocorrências em uma string. O resultado retornado é True se a uma ocorrência for encontrada. O código a seguir irá mostrar como testar um padrão contra uma string:
Sub RegexTestandoPadrao()
Dim stringExemplo As String
Dim regexUm As Object
Set regexUm = New RegExp
regexUm.Pattern = "f....a"
stringExemplo = "000111fjo88a8"
Debug.Print regexUm.Test(stringExemplo )
End Sub
O resultado é:
Substituindo a na String a Ocorrência de um Padrão
Você pode utilizar o método Replace (substituir) para efetuar a substituição da primeira ocorrência de um padrão em uma string, ou substituir todas as ocorrências de um padrão em uma string. Se a propriedade Global está definida como False, então somente a primeira ocorrência será substituída. O código a seguir irá mostrar como substituir uma ocorrência de um determinado padrão em uma dada string:
Sub RegexSubstituirOcorrencia()
Dim stringExemplo As String
Dim regexUm As Object
Set regexUm = New RegExp
regexUm.Pattern = "Este é o número"
regexUm.Global = False
stringExemplo = "Este é o número 718901"
Debug.Print regexUm.Replace(stringExemplo , "Esse é o novo número")
End Sub
O resultado é:
Para substituir apenas a porção numérica da string usado acima, você deve utilizar o seguinte código:
Sub RegexSubstituirOcorrencia()
Dim stringExemplo As String
Dim regexUm As Object
Set regexUm = New RegExp
regexUm.Pattern = "[^\D]+"
regexUm.Global = False
stringExemplo = "This is the number 105999"
Debug.Print regexUm.Replace(stringExemplo, "777192")
End Sub
O resultado é:
Para substituir todas as ocorrências de um certo padrão em uma string, você deve definir a propriedade Global como True. O código a seguir mostra como você pode substituir todas as ocorrencias de de -A1289C- em uma string:
Sub RegexSubstituirTodasAsOcorrencias()
Dim stringExemplo As String
Dim regexUm As Object
Set regexUm = New RegExp
regexUm.Pattern = "\W\A\d+C\W"
regexUm.Global = True
stringExemplo = "ABC-A1289C-ABC-A1289C-ABC"
Debug.Print regexUm.Replace(stringExemplo , "IJK")
End Sub
Encontrando e Exibindo Uma Ocorrência em uma String
Você pode utilizar o método Executar para encontrar uma ou todas as ocorrências de um padrão dentro de uma string. O código a seguir mostra como encontrar e exibir todas as ocorrências de um padrão em uma string:
Sub RegexEncontrarEExibirAOcorrencia()
Dim stringExemplo As String
Dim regexUm As Object
Dim ListaDeOcorrencias As Object
Dim Ocorrencia As Object
Set regexUm = New RegExp
regexUm.Pattern = "A.C"
regexUm.Global = True
regexUm.IgnoreCase = True
stringExemplo = "ABC-A1289C-ADC-A1289C-AJC"
Set ListaDeOcorrencias = regexUm.Execute(stringExemplo)
For Each Ocorrencia In ListaDeOcorrencias
Debug.Print Ocorrencia.Value
Next
End Sub
O resultado é:
Suponha que quiséssemos encontrar apenas a porção -ADC- da string acima. O código a seguir mostra como encontrar e exibir somente -ADC- da string:
Sub RegexEncontrarEExibirAOcorrencia()
Dim stringExemplo As String
Dim regexUm As Object
Dim ListaDeOcorrencias As Object
Dim Ocorrencia As Object
Set regexUm = New RegExp
regexUm.Pattern = "\-\A.C\-"
regexUm.Global = False
regexUm.IgnoreCase = True
stringExemplo = "ABC-A1289C-ADC-A1289C-AEC"
Set ListaDeOcorrencias = regexUm.Execute(stringExemplo)
For Each Ocorrencia In ListaDeOcorrencias
Debug.Print Ocorrencia.Value
Next
End Sub
Pode levar algum tempo para aprender a utilizar Expressões Regulares, no entanto, são uma ferramenta extremamente poderosa para identificar/manipular strings de texto. Além disso, são largamente utilizadas entre as linguagens de programação.