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.

regexp_late_binding.bas
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

PropiedadDescripciónValor predeterminado
PatternEl patrón de expresión regularNinguno
GlobalBuscar en toda la cadenaFalse
IgnoreCaseCoincidencia sin distinguir mayúsculasFalse

Propiedad Pattern

Especifica el patrón de expresión regular para buscar.

patron_ejemplo.bas
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.

global_ejemplo.bas
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étodoDescripciónTipo de retorno
TestVerificar si el patrón coincideBoolean
ExecuteObtener cadenas coincidentesMatchCollection
ReplaceReemplazar cadenas coincidentesString

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.

metodo_test.bas
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.

metodo_execute.bas
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.

metodo_replace.bas
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ónDescripciónEjemplo
\dCualquier dígito (0-9)\d+ coincide “123”
\wCarácter de palabra (a-z, A-Z, 0-9, _)\w+ coincide “abc”
\sCarácter de espacio en blanco\s+ coincide espacios
.Cualquier carácter excepto nueva líneaa.c coincide “abc”
*Cero o más del anteriorab*c coincide “ac”
+Uno o más del anteriorab+c coincide “abc”
?Cero o uno del anteriorab?c coincide “ac”
{n}Exactamente n ocurrenciasa{3} coincide “aaa”
[]Clase de caracteres[abc] coincide “a”, “b” o “c”
^Inicio de cadena^Hola coincide “Hola Mundo”
$Fin de cadenaMundo$ coincide “Hola Mundo”

Ejemplos prácticos

Validación de correo electrónico

validacion_email.bas
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

formateo_telefono.bas
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.

#VBA #Expresiones regulares #RegExp #Coincidencia de patrones