Excluindo texto durante a pesquisa de VBA (Excel) RegEx

0

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 numerais romanos de um a quatro, ou seja, I, II, III e IV). Como exemplo, pegue a seguinte lista de possíveis itens:

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 do VBA para substituir os dígitos e numerais romanos (não estou preocupado em aparar ou qualquer coisa nesse ponto):

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 me deparei com um problema. Minha RegEx altera incorretamente a frase IT Instructor 2 e a transforma em ITnstructor (por causa do espaço e depois da palavra Instructor , que começa com um I que é o mesmo que numeral romano um). Tentei encontrar a resposta on-line e testei muitas variações para que o RegEx exclua a frase Instrutor na pesquisa, mas não consigo fazer com que ela funcione. Alguns dos padrões que eu 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

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 sequência de caracteres (como o Instrutor) de fazer parte da pesquisa usando expressões regulares do Excel 2016 VBA? Se assim for, alguém pode me apontar na direção correta sobre como excluir itens durante um VBA RegEx?

Obrigado

    
por STGdb 05.03.2018 / 18:29

1 resposta

1

Eu percebi isso. A seguinte sintaxe funciona para mim (muita tentativa e erro):

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

- EDITADO para adicionar os detalhes abaixo -

Adicionei uma palavra adicional (ou seja, Info ) à exclusão RegEx:

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

Detalhes do padrão:

  • \ b - Definir limite de palavras
  • (?! (?: Info | Instrutor) \ b) - Zero ou uma (?) exclusões (!) para as palavras que se seguem. Grupo que não captura, porque não os queremos. O \ b no final é uma palavra limite
  • (?: [0-9] + | \ s [i] + | \ s [iv] $) - Corresponde a um ou mais 0 a 9 dígitos. Corresponda um espaço (\ s) seguido por um ou mais caracteres i. Combine um espaço seguido por iv ($ diz pesquisa no final)
  • | = OR (usado ao longo)
  • \ b - Limite de palavras em dificuldade

- EDITADO porque, afinal, isso funcionou melhor para mim -

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