VBA Regex
In this Article
Este tutorial demostrará cómo usar Regex en VBA.
¿Qué es Regex?
Regex significa expresión regular. Una expresión regular es un patrón compuesto por una secuencia de caracteres que se puede utilizar para encontrar un patrón coincidente en otra cadena. Para usar Regex en VBA tiene que usar el objeto RegExp.
Un patrón como [A-C] puede utilizarse para buscar y hacer coincidir una letra mayúscula de la A a la C de una secuencia. Los patrones Regex tienen su propia sintaxis y pueden ser construidos usando un carácter o una secuencia de caracteres.
Coincidencia de caracteres
La siguiente tabla muestra la sintaxis que le permitirá construir patrones Regex.
Sintaxis del patrón | Descripción | Ejemplo | Coincidencias encontradas |
---|---|---|---|
. | Coincide con cualquier carácter único excepto vbNewLine | f.n | fan, fon, f@n, fwn |
[caracteres] | Coincide con cualquier carácter único entre corchetes[] | [fn] | Sólo coincide con «f» o «n» en fan |
[^caracteres] | Coincide con cualquier carácter que no esté entre corchetes[] | [^fn] | Así que coincidiría con «j» en «fjn» |
[inicio-fin] | Coincide con cualquier carácter que forme parte del rango entre corchetes[] | [1-5] | Coincidiría con «4» y «5» en «45» |
\w | Coincide con los caracteres alfanuméricos y el guión bajo, pero no con el carácter de espacio | \w | Coincidiría con «c» en «,c» |
\W | Coincide con cualquier carácter no alfanumérico y el guión bajo | \W | Coincidiría con «@» en «bb@bb» |
\s | Coincide con cualquier carácter de espacio en blanco, como espacios y tabulaciones | \s | Coincidiría con » » en «This is» |
\S | Coincide con cualquier carácter que no sea un espacio en blanco | \S | Coincidiría con «T» y «h» en «T h» |
\d | Coincide con cualquier dígito decimal | \d | Coincidiría con «7» en «a7h» |
\D | Coincide con cualquier dígito no decimal | \D | Coincidiría con la j en «47j» |
\ | Escapa a los caracteres especiales, lo que le permite buscarlos | \. | Coincidiría con «.» en «59.pQ» |
\t | Pestaña | \t | Coincidiría con un carácter de tabulación |
\r | Retorno de carro (Return) | \r | Coincidiría con un retorno de carro (vbCr) |
\n | vbNewLine(vbTab) | \n | Coincidiría con una nueva línea |
Cuantificadores
Puede utilizar cuantificadores para especificar cuántas veces quiere que el patrón coincida con la cadena.
Cuantificador | Descripción | Ejemplo | Coincidencias encontradas |
---|---|---|---|
* | Coincide con cero o más ocurrencias | fn*a | fna, fa, fnna, fnnna, fnfnnna |
+ | Coincide con una o más ocurrencias | fn+a | fna, fnna, fnfnna |
? | Coincide con cero o uno | fn?a | fa, fna |
{n} | Coincide con «n» veces | d\W{4} | Coincidiría con «d….» en «d….&5hi» |
{n,} | Coincide al menos «n» veces | d\W{4,} | Coincidiría con «d….&» en «d….&5hi» |
{n,m} | Coincide entre n y m número de veces | d\W{1,8} | Coincidiría con «d….&&&&» en «d….&&&&5hi» |
Agrupación
La agrupación o captura le permite utilizar un patrón para capturar y extraer una parte de una cadena. De este modo, no sólo se compara el patrón, sino que se captura la parte de la cadena que coincide con el patrón.
Patrón | Descripción | Ejemplo | Coincidencias encontradas y capturadas |
---|---|---|---|
(expresión) | Agrupa y captura el patrón entre paréntesis | (\W{4}) | Agruparía y capturaría «@@@@» de «1@@@@1jlmba» |
Cómo utilizar Regex en VBA
Para utilizar Regex en VBA, primero tiene que establecer la referencia en el editor VBE. En el editor VBE, vaya a Herramientas > Referencias > Expresiones regulares
de Microsoft VBScript.
Estas son las propiedades del objeto RegExp:
- Pattern – El patrón que va a utilizar para comparar con la cadena.
- IgnoreCase – Si es Verdadero, entonces la coincidencia ignora las mayúsculas y minúsculas.
- Global – Si es True, entonces se encuentran todas las coincidencias del patrón en la cadena. Si es Falso, sólo se encuentra la primera coincidencia.
- MultiLine – Si es Verdadero, la coincidencia del patrón ocurre a través de los saltos de línea.
Estos son los métodos del objeto RegExp:
- Test – Busca un patrón en una cadena y devuelve True si se encuentra una coincidencia.
- Replace – Reemplaza las ocurrencias del patrón con la cadena de reemplazo.
- Execute – Devuelve las coincidencias del patrón con la cadena.
Comprobación de la coincidencia de un patrón con una cadena
Puede utilizar el método Test para comprobar si un patrón coincide con una secuencia de la cadena de entrada. El resultado es True si se encuentra una coincidencia. El siguiente código le mostrará cómo probar un patrón contra una cadena:
Sub Regex_Prueba_A_Patron()
Dim cadena1 As String
Dim expresion1 As Object
Set expresion1 = New RegExp
expresion1.Pattern = "f....a"
cadena1 = "000111fjo88a8"
Debug.Print expresion1.Test(cadena1)
End Sub
El resultado es:
Reemplazar un patrón en una cadena
Puede utilizar el método Replace para reemplazar la primera instancia de un patrón coincidente en una cadena o todas las instancias de un patrón coincidente en una cadena. Si Global se establece en False, sólo se reemplaza la primera instancia. El siguiente código le mostrará cómo reemplazar un patrón en una cadena:
Sub RegexReemplazarUnPatronEnCadena()
Dim cadena1 As String
Dim expresion1 As Object
Set expresion1 = New RegExp
expresion1.Pattern = "Este es el número"
expresion1.Global = False
cadena1 = "Este es el número 718901"
Debug.Print expresion1.Replace(cadena1, "Este es el nuevo número")
End Sub
El resultado es:
Para reemplazar sólo la porción numérica de la cadena utilizada anteriormente, se utilizaría el siguiente código:
Sub RegexReemplazarPatronSoloParte()
Dim cadena1 As String
Dim expresion1 As Object
Set expresion1 = New RegExp
expresion1.Pattern = "[^\D]+"
expresion1.Global = False
cadena1 = "Este es el número 718901"
Debug.Print expresion1.Replace(cadena1, "777192")
End Sub
El resultado es:
Para reemplazar todas las instancias de un determinado patrón en una cadena, se pondría el valor global a True. El siguiente código muestra cómo reemplazar cada instancia de -A1289C- en la cadena:
Sub RegexRemplazarTodasOcurrenciasDeUnPatron()
Dim cadena1 As String
Dim expresion1 As Object
Set expresion1 = New RegExp
expresion1.Pattern = "\W\A\d+C\W"
expresion1.Global = True
cadena1 = "ABC-A1289C-ABC-A1289C-ABC"
Debug.Print expresion1.Replace(cadena1, "IJK")
End Sub
Comparación y visualización de un patrón en una cadena
Puede utilizar el método Execute para hacer coincidir una o todas las instancias de un patrón dentro de una cadena. El siguiente código muestra cómo hacer coincidir y mostrar todas las instancias del patrón de la cadena:
Sub RegexCompararVisualizarPatronEnCadena()
Dim cadena1 As String
Dim expresion1 As Object
Set expresion1 = New RegExp
expresion1.Pattern = "A.C"
expresion1.Global = True
expresion1.IgnoreCase = IgnoreCase
cadena1 = "ABC-A1289C-ADC-A1289C-AJC"
Set coincidencias = expresion1.Execute(cadena1)
For Each coincidencia In coincidencias
Debug.Print coincidencia.Value
Next
End Sub
El resultado es:
Supongamos que sólo queremos coincidir con -ADC- de la cadena anterior. El siguiente código muestra cómo hacer coincidir y mostrar sólo -ADC- de la cadena:
Sub RegexCompararCoincidenciasPatronEnCadena()
Dim cadena1 As String
Dim expresion1 As Object
Set expresion1 = New RegExp
expresion1.Pattern = "\-\A.C\-"
expresion1.Global = False
expresion1.IgnoreCase = IgnoreCase
cadena1 = "ABC-A1289C-ADC-A1289C-AJC"
Set coincidencias = expresion1.Execute(cadena1)
For Each coincidencia In coincidencias
Debug.Print coincidencia.Value
Next
End Sub
Regex puede tomar algún tiempo para aprender, pero es una herramienta extremadamente poderosa para identificar/manipular cadenas de texto. También se utiliza ampliamente en todos los lenguajes de programación.