Exclusión de texto durante la búsqueda RegEx de VBA (Excel)

Exclusión de texto durante la búsqueda RegEx de VBA (Excel)

Tengo una función dentro de una macro que usa una expresión regular en Excel 2016 (VBA) que debería eliminar todos los números del texto para que básicamente termine solo con caracteres alfabéticos. El problema es que estos números no son solo dígitos, sino que también pueden ser números romanos (solo incluyen los números romanos del uno al cuatro, que son I, II, III y IV). Como ejemplo, tomemos la siguiente lista de posibles elementos:

Program Manager 3
Systems Engineer 3
Secretary III 12345
Consultant
IT Instructor 3
Computer Operations Manager 1
User Support Specialist 2
Engineering Tech II 12345
IT Instructor 2
Network Tech 3

Mi función utiliza el siguiente código de expresión regular de VBA para reemplazar los dígitos y los números romanos (no me preocupa recortar ni nada en este momento):

Public Function RemoveNumbers(Txt As String) As String
    With CreateObject("VBScript.RegExp")
        .Global = True
        .IgnoreCase = True
        .Pattern = "[0-9]|\s[i]+|\s[iv]$"
        RemoveNumbers = .Replace(Txt, "")
    End With
End Function

En general, eso funciona bien, excepto que me encontré con un problema. Mi RegEx altera incorrectamente la fraseInstructor de TI 2y lo convierte enInstructor de TI(por el espacio y luego la palabraInstructor, que comienza con unIque es lo mismo que el número romano uno). Intenté encontrar la respuesta en línea y probé muchas variaciones para que RegEx excluya la frase.Instructoren la busqueda pero no logro hacerlo funcionar. Algunos de los patrones que he intentado utilizar incluyen:

        .Pattern = "\b(!Instructor)\b|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "\b(!Instructor)\b\w+|[0-9]|\s[i]+|\s[iv]$"

        .Pattern = "(!Instructor\b)|[0-9]|\s[i]+|\s[iv]$"
...etc

Y como tengo que eliminar el número romano uno (I), no puedo usar lo siguiente como solución alternativa:

        .Pattern = "[0-9]|\s[i]{2,}|\s[iv]$"

¿Es posible excluir una cadena (como Instructor) para que no forme parte de la búsqueda utilizando expresiones regulares de Excel 2016 VBA? Si es así, ¿alguien puede indicarme la dirección correcta sobre cómo excluir elementos durante una expresión regular de VBA?

Gracias

Respuesta1

Me lo imaginé. La siguiente sintaxis me funciona (mucha prueba y error):

    .Pattern = "\b(?!(?:Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

-- EDITADO para agregar los detalles a continuación --

Agregué una palabra adicional (es decir,Información) a la exclusión RegEx:

"\b(?!(?:Info|Instructor)\b)(?:[0-9]+|\s[i]+|\s[iv]$)\b"

Detalles del patrón:

  • \b - Establecer límite de palabra
  • (?!(?:Info|Instructor)\b) - Cero o una (?) exclusiones (!) para las palabras que siguen. Grupo de no captura porque no los queremos. El \b al final es un límite de palabra.
  • (?:[0-9]+|\s[i]+|\s[iv]$) - Coincide con uno o más de 0 a 9 dígitos. Haga coincidir un espacio (\s) seguido de uno o más caracteres i. Haga coincidir un espacio seguido de iv ($ dice buscar al final)
  • | = O (usado en todo momento)
  • \b - Límite de palabra final

- EDITADO porque, en última instancia, esto funcionó mejor para mí.

        .Pattern = "\b(?:[0-9]+|\s[i]+|\s[iv]+$)\b"

información relacionada