Excluindo texto durante a pesquisa RegEx do VBA (Excel)

Excluindo texto durante a pesquisa RegEx do VBA (Excel)

Eu tenho uma função dentro de uma macro usando expressão regular no Excel 2016 (VBA) que deve remover todos os números do texto para que eu basicamente acabe com apenas caracteres alfabéticos. O problema é que esses números não são apenas dígitos, mas também podem ser algarismos romanos (incluindo apenas os algarismos romanos de um a quatro, que são I, II, III e IV). Como exemplo, tome a seguinte lista de itens possíveis:

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

Minha função usa o seguinte código de expressão regular VBA para substituir os dígitos e algarismos romanos (não estou preocupado em cortar nem nada neste 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

Geralmente, isso funciona bem, exceto que encontrei um problema. Meu RegEx altera incorretamente a fraseInstrutor de TI 2e o transforma emInstrutor de TI(por causa do espaço e depois da palavraInstrutor, que começa com umEUque é igual ao algarismo romano um). Tentei encontrar a resposta on-line e testei muitas variações para fazer com que o RegEx excluísse a fraseInstrutorna pesquisa, mas não consigo fazê-lo funcionar. Alguns dos padrões que tentei usar incluem:

        .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

E como preciso remover o numeral romano (I), não posso usar o seguinte como solução alternativa:

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

É possível excluir uma string (como Instrutor) de fazer parte da pesquisa usando expressões regulares VBA do Excel 2016? Em caso afirmativo, alguém pode me indicar a direção correta sobre como excluir itens durante um RegEx do VBA?

Obrigado

Responder1

Eu descobri. A seguinte sintaxe funciona para mim (muitas tentativas e erros):

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

-- EDITADO para adicionar os detalhes abaixo --

Eu adicionei uma palavra adicional (ou seja,Informações) com exclusão do RegEx:

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

Detalhes do padrão:

  • \b - Definir limite do Word
  • (?!(?:Info|Instructor)\b) - Zero ou uma (?) exclusões (!) para as palavras a seguir. Grupo que não captura porque não os queremos. O \b no final é um limite de palavra
  • (?:[0-9]+|\s[i]+|\s[iv]$) - Combine um ou mais dígitos de 0 a 9. Combine um espaço (\s) seguido por um ou mais caracteres i. Combine um espaço seguido por iv ($ diz pesquisa no final)
  • | = OU (usado em todo)
  • \b - Limite da palavra final

-- EDITADO porque, em última análise, funcionou melhor para mim --

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

informação relacionada