Cómo usar expresiones regulares (expresiones regulares) en Microsoft Excel tanto en la celda como en los bucles


592

¿Cómo puedo usar expresiones regulares en Excel y aprovechar la poderosa configuración de cuadrícula de Excel para la manipulación de datos?

  • Función en celda para devolver un patrón coincidente o un valor reemplazado en una cadena.
  • Sub para recorrer una columna de datos y extraer coincidencias con celdas adyacentes.
  • ¿Qué configuración es necesaria?
  • ¿Cuáles son los caracteres especiales de Excel para las expresiones regulares?

Entiendo expresión regular no es ideal para muchas situaciones ( para usar o no usar expresiones regulares? ), Ya que Excel puede utilizar Left, Mid, Right, Instrcomandos de tipo de manipulaciones similares.


11
Recomiendo este artículo de VB / VBA Regexp de Patrick Matthews
brettdj

1
Pruebe este complemento gratuito: seotoolsforexcel.com/regexpfind
Niels Bosma el

1
No olvidemos el Like operador , que proporciona una especie de versión ligera de la funcionalidad de estilo regex. Por lo general, es mucho más rápido que regex, incluso si está envuelto en un procedimiento secundario o de función.
Egalth

Respuestas:


955

Las expresiones regulares se utilizan para la coincidencia de patrones.

Para usar en Excel, siga estos pasos:

Paso 1 : Agregue la referencia de VBA a "Microsoft VBScript Regular Expressions 5.5"

  • Seleccione la pestaña "Desarrollador" ( no tengo esta pestaña, ¿qué debo hacer? )
  • Seleccione el icono "Visual Basic" de la sección de la cinta 'Código'
  • En la ventana "Microsoft Visual Basic para Aplicaciones", seleccione "Herramientas" en el menú superior.
  • Seleccione "Referencias"
  • Marque la casilla junto a "Microsoft VBScript Regular Expressions 5.5" para incluir en su libro.
  • Haga clic en Aceptar"

Paso 2 : define tu patrón

Definiciones basicas:

- Rango.

  • Por ejemplo, a-zcoincide con letras minúsculas de a a z
  • Por ejemplo, 0-5coincide con cualquier número del 0 al 5

[] Haga coincidir exactamente uno de los objetos dentro de estos corchetes.

  • Por ejemplo, [a]coincide con la letra a
  • Por ejemplo, [abc]coincide con una sola letra que puede ser a, bo c
  • Por ejemplo, [a-z]coincide con cualquier letra minúscula del alfabeto.

()Agrupa diferentes coincidencias para propósitos de devolución. Ver ejemplos a continuación.

{} Multiplicador para copias repetidas del patrón definido antes.

  • Por ejemplo, [a]{2}coincide con dos letras minúsculas consecutivas a:aa
  • Por ejemplo, [a]{1,3}coincide con al menos uno y hasta tres letra minúscula a, aa,aaa

+ Haga coincidir al menos uno, o más, del patrón definido antes.

  • Por ejemplo a+coincidirá con una consecutivo de a, aa, aaa, etc.

? Haga coincidir cero o uno de los patrones definidos antes.

  • Por ejemplo, el patrón puede o no estar presente, pero solo puede coincidir una vez.
  • Por ejemplo, [a-z]?coincide con una cadena vacía o cualquier letra minúscula.

* Haga coincidir cero o más del patrón definido antes. - Por ejemplo, comodín para un patrón que puede o no estar presente. - Por ejemplo, [a-z]*coincide con una cadena vacía o una cadena de letras minúsculas.

. Coincide con cualquier personaje excepto la nueva línea \n

  • Por ejemplo, a.coincide con una cadena de dos caracteres que comienza con a y termina con cualquier cosa excepto\n

| Operador OR

  • Por ejemplo, a|bsignifica ao bpuede ser igualado.
  • Por ejemplo, red|white|orangecoincide exactamente con uno de los colores.

^ NO operador

  • Por ejemplo, el [^0-9]carácter no puede contener un número.
  • Por ejemplo, el [^aA]carácter no puede ser minúscula ao mayúsculaA

\ Huye del carácter especial que sigue (anula el comportamiento anterior)

  • Por ejemplo \., \\, \(, \?, \$,\^

Patrones de anclaje:

^ La coincidencia debe ocurrir al comienzo de la cadena

  • Por ejemplo, el ^aprimer carácter debe ser minúsculaa
  • Por ejemplo, el ^[0-9]primer carácter debe ser un número.

$ La coincidencia debe ocurrir al final de la cadena

  • Por ejemplo, el a$último carácter debe ser minúsculaa

Tabla de precedencia:

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |

Abreviaturas de caracteres predefinidas:

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line

Ejemplo 1 : ejecutar como macro

La siguiente macro de ejemplo examina el valor en la celda A1para ver si los primeros 1 o 2 caracteres son dígitos. Si es así, se eliminan y se muestra el resto de la cadena. De lo contrario, aparece un cuadro que le indica que no se encontró ninguna coincidencia. Los A1valores de celda de 12abcwill return abc, value of 1abcwill return abc, value of abc123will return "Not Matched" porque los dígitos no estaban al comienzo de la cadena.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1")

    If strPattern <> "" Then
        strInput = Myrange.Value

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub

Ejemplo 2 : ejecutar como una función en la celda

Este ejemplo es el mismo que el ejemplo 1 pero está configurado para ejecutarse como una función en la celda. Para usar, cambie el código a esto:

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String


    strPattern = "^[0-9]{1,3}"

    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""

        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With

        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

Coloque sus cadenas ("12abc") en la celda A1. Ingrese esta fórmula =simpleCellRegex(A1)en la celda B1y el resultado será "abc".

imagen de resultados


Ejemplo 3 : Bucle a través del rango

Este ejemplo es el mismo que el ejemplo 1, pero recorre un rango de celdas.

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A5")

    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub

Ejemplo 4 : dividir diferentes patrones

Este ejemplo recorre un rango ( A1, A2& A3) y busca una cadena que comience con tres dígitos seguidos de un solo carácter alfa y luego 4 dígitos numéricos. La salida divide las coincidencias de patrones en celdas adyacentes mediante el uso de (). $1representa el primer patrón que coincide con el primer conjunto de ().

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range

    Set Myrange = ActiveSheet.Range("A1:A3")

    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"

        If strPattern <> "" Then
            strInput = C.Value

            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With

            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

Resultados:

imagen de resultados


Ejemplos de patrones adicionales

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit

22
No deberías olvidarlo Set regEx = Nothing. Obtendrá excepciones de memoria insuficiente cuando ese Sub se ejecute con suficiente frecuencia.
Kiril

1
Adapté el ejemplo 4 con SubMatches para tratar expresiones regulares más complejas, básicamente no uso reemplazar cuando se divide, si alguien está interesado: stackoverflow.com/questions/30218413/…
Armfoot

11
Línea de encuadernación tardía:Set regEx = CreateObject("VBScript.RegExp")
ZygD

2
De acuerdo, estoy bastante seguro de que es porque el código está en ThisWorkbook. Intenta mover el código a otro Module.
Portland Runner,

3
@PortlandRunner en el "explorador de proyectos" (?) Este archivo de Excel carecía de una subcarpeta "Módulos", aunque otro archivo mostraba uno. Haz clic derecho en el archivo y elige 'insertar módulo', luego haz doble clic en "Módulo 1" y pega el código. Salvado. Volvió al libro de trabajo y volvió a ingresar la función: funcionó. ¿Podría ser notable en la respuesta, por el bien de los inexpertos como yo? Gracias por la ayuda.
youcantryreachingme

205

Para hacer uso de expresiones regulares directamente en fórmulas de Excel, la siguiente UDF (función definida por el usuario) puede ser de ayuda. Expone más o menos directamente la funcionalidad de expresión regular como una función de Excel.

Cómo funciona

Se necesitan 2-3 parámetros.

  1. Un texto para usar la expresión regular.
  2. Una expresión regular
  3. Una cadena de formato que especifica cómo debería verse el resultado. Puede contener $0, $1, $2, y así sucesivamente. $0es la coincidencia completa, $1y arriba corresponde a los respectivos grupos de coincidencia en la expresión regular. Por defecto es $0.

Algunos ejemplos

Extraer una dirección de correo electrónico:

=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+")
=regex("Peter Gordon: some@email.com, 47", "\w+@\w+\.\w+", "$0")

Resultados en: some@email.com

Extrayendo varias subcadenas:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "E-Mail: $2, Name: $1")

Resultados en: E-Mail: some@email.com, Name: Peter Gordon

Para separar una cadena combinada en una sola celda en sus componentes en varias celdas:

=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 1)
=regex("Peter Gordon: some@email.com, 47", "^(.+): (.+), (\d+)$", "$" & 2)

Resultados en: Peter Gordon some@email.com...

Cómo utilizar

Para usar este UDF haga lo siguiente (aproximadamente basado en esta página de Microsoft . ¡Tienen buena información adicional allí!):

  1. En Excel en un archivo habilitado para Macro ('.xlsm') presione ALT+F11para abrir el Editor de Microsoft Visual Basic para Aplicaciones .
  2. Agregue referencia de VBA a la biblioteca de expresiones regulares (copiada descaradamente de la respuesta de Portland Runners ++ ):
    1. Haga clic en Herramientas -> Referencias (disculpe la captura de pantalla alemana) Herramientas -> Referencias
    2. Busque Microsoft VBScript Regular Expressions 5.5 en la lista y marque la casilla de verificación al lado.
    3. Haga clic en OK .
  3. Haga clic en Insertar módulo . Si le da a su módulo un nombre diferente, asegúrese de que el Módulo no tenga el mismo nombre que el UDF a continuación (por ejemplo, al nombrar el Módulo Regexy la función regexcausa errores # ¡NOMBRE! ).

    Segundo icono en la fila de iconos -> Módulo

  4. En la ventana de texto grande en el medio inserte lo siguiente:

    Function regex(strInput As String, matchPattern As String, Optional ByVal outputPattern As String = "$0") As Variant
        Dim inputRegexObj As New VBScript_RegExp_55.RegExp, outputRegexObj As New VBScript_RegExp_55.RegExp, outReplaceRegexObj As New VBScript_RegExp_55.RegExp
        Dim inputMatches As Object, replaceMatches As Object, replaceMatch As Object
        Dim replaceNumber As Integer
    
        With inputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
        With outputRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = "\$(\d+)"
        End With
        With outReplaceRegexObj
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
        End With
    
        Set inputMatches = inputRegexObj.Execute(strInput)
        If inputMatches.Count = 0 Then
            regex = False
        Else
            Set replaceMatches = outputRegexObj.Execute(outputPattern)
            For Each replaceMatch In replaceMatches
                replaceNumber = replaceMatch.SubMatches(0)
                outReplaceRegexObj.Pattern = "\$" & replaceNumber
    
                If replaceNumber = 0 Then
                    outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).Value)
                Else
                    If replaceNumber > inputMatches(0).SubMatches.Count Then
                        'regex = "A to high $ tag found. Largest allowed is $" & inputMatches(0).SubMatches.Count & "."
                        regex = CVErr(xlErrValue)
                        Exit Function
                    Else
                        outputPattern = outReplaceRegexObj.Replace(outputPattern, inputMatches(0).SubMatches(replaceNumber - 1))
                    End If
                End If
            Next
            regex = outputPattern
        End If
    End Function
  5. Guarde y cierre la ventana del Editor de Microsoft Visual Basic para Aplicaciones .


66
Esta respuesta combinada con los pasos aquí para crear un complemento, ha sido muy útil. Gracias. ¡Asegúrese de no darle a su módulo y función el mismo nombre!
Chris Hunt

2
Solo reiterando el comentario anterior de Chris Hunt. No llame a su Módulo 'Regex' también. Pensé que me estaba volviendo loco por un tiempo ya que la función no funcionaría debido a un error #NAME
Chris

Bueno, me he vuelto loco al intentarlo todo (incluido el cambio de módulos / nombres) y aún obtengo el error #NAME
Enissay

@Enissay: intente crear un Function foo() As Variant \n foo="Hello World" \n End FunctionUDF mínimo para ver si eso funciona. En caso afirmativo, avance hasta llegar a lo anterior, si no hay algo básico roto (¿macros deshabilitadas?).
Patrick Böker


64

Ampliando la respuesta de patszim para aquellos apurados .

  1. Abra el libro de Excel.
  2. Alt+ F11para abrir la ventana VBA / Macros.
  3. Agregue referencia a expresiones regulares en Herramientas y luego en Referencias
    ! [Formulario Excel VBA agregar referencias
  4. y seleccionando Microsoft VBScript Regular Expression 5.5
    ! [Excel VBA agregar referencia de expresiones regulares
  5. Inserte un nuevo módulo (el código debe residir en el módulo; de lo contrario, no funciona).
    ! [Módulo de código de inserción Excel VBA
  6. En el módulo recién insertado,
    ! [Excel VBA inserta el código en el módulo
  7. agregue el siguiente código:

    Function RegxFunc(strInput As String, regexPattern As String) As String
        Dim regEx As New RegExp
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .pattern = regexPattern
        End With
    
        If regEx.Test(strInput) Then
            Set matches = regEx.Execute(strInput)
            RegxFunc = matches(0).Value
        Else
            RegxFunc = "not matched"
        End If
    End Function
  8. El patrón regex se coloca en una de las celdas y se usa referencia absoluta en él. ! [Excel regex function uso en celda La función estará vinculada al libro de trabajo en el que se creó.
    Si es necesario que se use en diferentes libros de trabajo, almacene la función en Personal.XLSB


1
Gracias por mencionar que debe estar en Personal.xlsb para estar disponible en todos los documentos de Excel en los que trabaje. La mayoría (?) Otras respuestas no lo dejan claro. Personal.XLSB iría en la carpeta (podría necesitar crear la carpeta) C: \ Users \ nombre de usuario \ AppData \ Local \ Microsoft \ Excel \ XLStart carpeta
Mark Stewart

26

Aquí está mi intento:

Function RegParse(ByVal pattern As String, ByVal html As String)
    Dim regex   As RegExp
    Set regex = New RegExp

    With regex
        .IgnoreCase = True  'ignoring cases while regex engine performs the search.
        .pattern = pattern  'declaring regex pattern.
        .Global = False     'restricting regex to find only first match.

        If .Test(html) Then         'Testing if the pattern matches or not
            mStr = .Execute(html)(0)        '.Execute(html)(0) will provide the String which matches with Regex
            RegParse = .Replace(mStr, "$1") '.Replace function will replace the String with whatever is in the first set of braces - $1.
        Else
            RegParse = "#N/A"
        End If

    End With
End Function

9

Necesitaba usar esto como una función de celda (como SUMo VLOOKUP) y descubrí que era fácil:

  1. Asegúrese de estar en un archivo de Excel con macro habilitado (guardar como xlsm).
  2. Herramientas de desarrollador abiertas Alt+F11
  3. Agregue Microsoft VBScript Regular Expressions 5.5 como en otras respuestas
  4. Cree la siguiente función en el libro o en su propio módulo:

    Function REGPLACE(myRange As Range, matchPattern As String, outputPattern As String) As Variant
        Dim regex As New VBScript_RegExp_55.RegExp
        Dim strInput As String
    
        strInput = myRange.Value
    
        With regex
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = matchPattern
        End With
    
        REGPLACE = regex.Replace(strInput, outputPattern)
    
    End Function
  5. Luego puede usar en la celda con =REGPLACE(B1, "(\w) (\d+)", "$1$2")(por ejemplo: "A 243" a "A243")


Esta denominación de outputPattern me desanimó. Es el valor de reemplazo.
Thor

1
Si. Supongo que lo dejé llamado patrón de lo que estaba claro que no era sólo de sustitución de cadenas y se podía utilizar encontraron grupos de expresiones regulares como $ 1 $ 2, etc
DeezCashews

7

Esta no es una respuesta directa, pero puede proporcionar una alternativa más eficiente para su consideración. Es decir, Google Sheets tiene varias funciones Regex incorporadas, que pueden ser muy convenientes y ayudar a eludir algunos de los procedimientos técnicos en Excel. Obviamente, hay algunas ventajas de usar Excel en su PC, pero para la gran mayoría de los usuarios, Google Sheets ofrecerá una experiencia idéntica y puede ofrecer algunos beneficios en la portabilidad y el intercambio de documentos.

Ellos ofrecen

REGEXEXTRACT: extrae subcadenas coincidentes de acuerdo con una expresión regular.

REGEXREPLACE: reemplaza parte de una cadena de texto con una cadena de texto diferente utilizando expresiones regulares.

SUSTITUTO: Reemplaza el texto existente con texto nuevo en una cadena.

REEMPLAZAR: Reemplaza parte de una cadena de texto con una cadena de texto diferente.

Puede escribirlos directamente en una celda y así producirá lo que quiera

=REGEXMATCH(A2, "[0-9]+")

También funcionan bastante bien en combinaciones con otras funciones, como las declaraciones IF , como estas :

=IF(REGEXMATCH(E8,"MiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*")/1000,IF(REGEXMATCH(E8,"GiB"),REGEXEXTRACT(E8,"\d*\.\d*|\d*"),"")

ingrese la descripción de la imagen aquí

Esperemos que esto proporcione una solución simple para los usuarios que se sienten burlados por el componente VBS de Excel.


Gracias por compartir Alex. Esto es útil para aquellos que buscan la versión de Google. Puede considerar escribir y responder otra pregunta específica de Google Sheets Regex, ya que tiene su propia nomenclatura y sería muy útil para los demás. De todos modos, ¡tienes mi voto a favor!
Portland Runner

4

Aquí hay una regex_subst()función. Ejemplos:

=regex_subst("watermellon", "[aeiou]", "")
---> wtrmlln
=regex_subst("watermellon", "[^aeiou]", "")
---> aeeo

Aquí está el código simplificado (más simple para mí, de todos modos). No pude descubrir cómo construir un patrón de salida adecuado usando lo anterior para funcionar como mis ejemplos:

Function regex_subst( _
     strInput As String _
   , matchPattern As String _
   , Optional ByVal replacePattern As String = "" _
) As Variant
    Dim inputRegexObj As New VBScript_RegExp_55.RegExp

    With inputRegexObj
        .Global = True
        .MultiLine = True
        .IgnoreCase = False
        .Pattern = matchPattern
    End With

    regex_subst = inputRegexObj.Replace(strInput, replacePattern)
End Function

1

No quiero tener que habilitar una biblioteca de referencia, ya que necesito que mis scripts sean portátiles. La Dim foo As New VBScript_RegExp_55.RegExplínea causó User Defined Type Not Definederrores, pero encontré una solución que funcionó para mí.

Lo que querrá hacer es poner una cadena de ejemplo en la celda A1, luego probar su strPattern. Una vez que esté funcionando, ajústelo rngcomo lo desee.

Public Sub RegExSearch()
'/programming/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops
'https://wellsr.com/vba/2018/excel/vba-regex-regular-expressions-guide/
'https://www.vitoshacademy.com/vba-regex-in-excel/
    Dim regexp As Object
    'Dim regex As New VBScript_RegExp_55.regexp 'Caused "User Defined Type Not Defined" Error
    Dim rng As Range, rcell As Range
    Dim strInput As String, strPattern As String

    Set regexp = CreateObject("vbscript.regexp")
    Set rng = ActiveSheet.Range("A1:A1")

    strPattern = "([a-z]{2})([0-9]{8})"
    'Search for 2 Letters then 8 Digits Eg: XY12345678 = Matched

    With regexp
        .Global = False
        .MultiLine = False
        .ignoreCase = True
        .Pattern = strPattern
    End With

    For Each rcell In rng.Cells

        If strPattern <> "" Then
            strInput = rcell.Value

            If regexp.test(strInput) Then
                MsgBox rcell & " Matched in Cell " & rcell.Address
            Else
                MsgBox "No Matches!"
            End If
        End If
    Next
End Sub

No quiero tener que habilitar una biblioteca de referencia, ya que necesito que mis scripts sean portátiles : la VBScript_RegExp_55biblioteca es bastante ubicua, por lo que conlleva un riesgo muy bajo de no estar en una máquina de destino particular. Y de todos modos, cambiar de Early Bound a Late Bound no resuelve el problema de la portabilidad (el código seguirá siendo un error, solo en tiempo de ejecución en lugar de tiempo de compilación)
Chris Neilsen

1
No, eso no es cierto en absoluto, este script se puede compartir con otro usuario sin que habilite nada que sea portátil. Gracias
FreeSoftwareServers

1
Claro, pero el código RegEx no será utilizable . Si las cosas de RegEx son parte de un libro de trabajo de la biblioteca más grande, supongo que si no arroja un error de compilación, por lo tanto, permitir que se usen otras partes podría considerarse útil
Chris Neilsen

1

Para agregar al valioso contenido, me gustaría crear este recordatorio de por qué a veces RegEx dentro de VBA no es ideal. No todas las expresiones son compatibles, pero en su lugar pueden arrojar una Error 5017y puede dejar al autor adivinando (de lo cual soy víctima).

Si bien podemos encontrar algunas fuentes sobre lo que es compatible, sería útil saber qué metacaracteres, etc., no son compatibles. Una explicación más detallada se puede encontrar aquí . Mencionado en esta fuente:

"Aunque" la expresión regular de VBScript ... la versión 5.5 implementa algunas características esenciales de expresiones regulares que faltaban en versiones anteriores de VBScript. ... JavaScript y VBScript implementan expresiones regulares de estilo Perl. Sin embargo, carecen de una serie de características avanzadas disponibles en Perl y otros sabores modernos de expresión regular: "


Por lo tanto, no son compatibles:

  • Inicio de String ancor \A, alternativamente use el ^cursor para hacer coincidir la posición antes del 1er carácter en la cadena
  • End of String ancor \Z, alternativamente, use el $signo de dólar para hacer coincidir la posición después del último carácter en la cadena
  • LookBehind positivo, por ejemplo: (?<=a)b(aunque se admite LookAhead positivo )
  • LookBehind negativo, por ejemplo: (?<!a)b(aunque se admite LookAhead negativo )
  • Agrupación Atómica
  • Cuantificadores posesivos
  • Unicode, por ejemplo: \{uFFFF}
  • Grupos de captura con nombre . Alternativamente, use grupos de captura numerados
  • Modificadores en línea, por ejemplo: /i(mayúsculas y minúsculas) o /g(global) etc. Ajústelos a través de las RegExppropiedades del objeto> RegExp.Global = Truey RegExp.IgnoreCase = Truesi están disponibles.
  • Condicionales
  • Comentarios de expresiones regulares . Agregue estos con 'comentarios regulares en el script

Ya golpeé un muro más de una vez usando expresiones regulares dentro de VBA. Por lo general, LookBehindpero a veces incluso me olvido de los modificadores. No he experimentado todos estos fondos mencionados anteriormente, pero pensé que trataría de ser extenso refiriéndome a información más detallada. Siéntase libre de comentar / corregir / agregar. Gran agradecimiento a regular-expressions.info por una gran cantidad de información.

PD: Usted ha mencionado métodos y funciones regulares de VBA, y puedo confirmar que (al menos para mí) han sido útiles en sus propias formas donde RegEx fallaría.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.