Expresiones Regulares (RegExp)
Al trabajar con cadenas en VBA, puedes encontrar requisitos de coincidencia de patrones complejos que las funciones simples de búsqueda y reemplazo no pueden manejar. Ahí es donde las Expresiones Regulares (RegExp) se vuelven invaluables.
Con expresiones regulares, puedes realizar eficientemente operaciones de cadenas avanzadas como validación de formato de correo electrónico, extracción de números de teléfono y reemplazo de texto basado en patrones.
Cuándo necesitas expresiones regulares
Las expresiones regulares son poderosas en estos escenarios:
- Validación de entrada: Verificar formatos de correo electrónico, números de teléfono, códigos postales
- Extracción de datos: Extraer patrones específicos de HTML o texto
- Reemplazo complejo: Transformar solo las partes que coinciden con ciertos patrones
- Análisis de archivos de registro: Extraer fechas, direcciones IP u otros datos formateados
- Limpieza de datos: Eliminar caracteres no deseados o espacios en blanco en masa
Conceptos básicos del objeto RegExp
Crear un objeto RegExp
Para usar expresiones regulares en VBA, crea un objeto VBScript.RegExp. Hay dos métodos:
Método 1: Usando CreateObject (Recomendado)
Este método funciona sin configuración de referencia y es más portable.
Sub RegExpLateBinding()
' No requiere configuración de referencia
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\d+"
Debug.Print re.Test("abc123") ' True
End Sub
El método CreateObject es recomendado porque no requiere configuración de referencia, haciendo que compartir macros entre entornos sea más fácil.
Propiedades principales de RegExp
| Propiedad | Descripción | Valor predeterminado |
|---|---|---|
Pattern | El patrón de expresión regular | Ninguno |
Global | Buscar en toda la cadena | False |
IgnoreCase | Coincidencia sin distinguir mayúsculas | False |
Propiedad Pattern
Especifica el patrón de expresión regular para buscar.
Sub PatronEjemplo()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
' Patrón de dígitos
re.Pattern = "\d+"
Debug.Print re.Test("Pedido123") ' True
' Patrón de correo electrónico
re.Pattern = "[\w\.-]+@[\w\.-]+\.\w+"
Debug.Print re.Test("[email protected]") ' True
End Sub
Propiedad Global
Cuando se establece en True, busca toda la cadena y devuelve todas las coincidencias. Cuando es False (predeterminado), devuelve solo la primera coincidencia.
Sub GlobalEjemplo()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\d+"
' Global = False (predeterminado): solo primera coincidencia
re.Global = False
Dim matches As Object
Set matches = re.Execute("abc123def456ghi789")
Debug.Print "Global=False: " & matches.Count & " coincidencia(s)" ' 1
' Global = True: todas las coincidencias
re.Global = True
Set matches = re.Execute("abc123def456ghi789")
Debug.Print "Global=True: " & matches.Count & " coincidencia(s)" ' 3
End Sub
Métodos principales de RegExp
| Método | Descripción | Tipo de retorno |
|---|---|---|
Test | Verificar si el patrón coincide | Boolean |
Execute | Obtener cadenas coincidentes | MatchCollection |
Replace | Reemplazar cadenas coincidentes | String |
Método Test: Verificar coincidencia de patrón
El método Test devuelve True o False indicando si la cadena coincide con el patrón.
Sub MetodoTestEjemplo()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
' Verificación de formato de teléfono (ej: 555-123-4567)
re.Pattern = "^\d{3}-\d{3}-\d{4}$"
Debug.Print re.Test("555-123-4567") ' True
Debug.Print re.Test("555-1234-567") ' False
Debug.Print re.Test("abc-def-ghij") ' False
End Sub
Método Execute: Obtener cadenas coincidentes
El método Execute devuelve coincidencias como un objeto MatchCollection.
Sub MetodoExecuteEjemplo()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\d+"
re.Global = True
Dim matches As Object
Dim match As Object
Set matches = re.Execute("Pedido123 tiene 45 artículos por $678")
Debug.Print "Cantidad de coincidencias: " & matches.Count
For Each match In matches
Debug.Print "Valor: " & match.Value & _
", Posición: " & match.FirstIndex & _
", Longitud: " & match.Length
Next match
End Sub
Método Replace: Reemplazar cadenas coincidentes
El método Replace reemplaza las coincidencias de patrón con texto especificado.
Sub MetodoReplaceEjemplo()
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "\d+"
re.Global = True
Dim resultado As String
resultado = re.Replace("Pedido123 tiene 45 artículos", "X")
Debug.Print resultado ' PedidoX tiene X artículos
End Sub
Sintaxis común de patrones
| Patrón | Descripción | Ejemplo |
|---|---|---|
\d | Cualquier dígito (0-9) | \d+ coincide “123” |
\w | Carácter de palabra (a-z, A-Z, 0-9, _) | \w+ coincide “abc” |
\s | Carácter de espacio en blanco | \s+ coincide espacios |
. | Cualquier carácter excepto nueva línea | a.c coincide “abc” |
* | Cero o más del anterior | ab*c coincide “ac” |
+ | Uno o más del anterior | ab+c coincide “abc” |
? | Cero o uno del anterior | ab?c coincide “ac” |
{n} | Exactamente n ocurrencias | a{3} coincide “aaa” |
[] | Clase de caracteres | [abc] coincide “a”, “b” o “c” |
^ | Inicio de cadena | ^Hola coincide “Hola Mundo” |
$ | Fin de cadena | Mundo$ coincide “Hola Mundo” |
Ejemplos prácticos
Validación de correo electrónico
Function EsEmailValido(email As String) As Boolean
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
' Patrón básico de email
re.Pattern = "^[\w\.-]+@[\w\.-]+\.\w{2,}$"
re.IgnoreCase = True
EsEmailValido = re.Test(email)
End Function
Sub TestValidacionEmail()
Debug.Print EsEmailValido("[email protected]") ' True
Debug.Print EsEmailValido("[email protected]") ' True
Debug.Print EsEmailValido("invalido@") ' False
End Sub
Formateo de número de teléfono
Function FormatearTelefono(phone As String) As String
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
' Eliminar todos los no dígitos
re.Pattern = "\D"
re.Global = True
Dim digitos As String
digitos = re.Replace(phone, "")
' Formatear como XXX-XXX-XXXX si tiene 10 dígitos
If Len(digitos) = 10 Then
FormatearTelefono = Left(digitos, 3) & "-" & _
Mid(digitos, 4, 3) & "-" & _
Right(digitos, 4)
Else
FormatearTelefono = phone
End If
End Function
Resumen
Las expresiones regulares en VBA proporcionan capacidades de coincidencia de patrones poderosas:
- Método Test: Verificaciones de validación rápidas
- Método Execute: Extraer todas las coincidencias con información de posición
- Método Replace: Transformación de texto basada en patrones
Domina las expresiones regulares para manejar tareas complejas de procesamiento de cadenas de manera eficiente.