Исключение текста при поиске VBA (Excel) RegEx

Исключение текста при поиске VBA (Excel) RegEx

У меня есть функция внутри макроса, использующая регулярное выражение в Excel 2016 (VBA), которая должна удалить все цифры из текста, так что в итоге у меня останутся только буквы. Загвоздка в том, что эти цифры не просто цифры, но они также могут быть римскими цифрами (включая только римские цифры от одного до четырех, то есть I, II, III и IV). В качестве примера возьмем следующий список возможных элементов:

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

Моя функция использует следующий код регулярного выражения VBA для замены цифр и римских цифр (на данном этапе меня не волнует обрезка или что-то в этом роде):

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

В общем, это работает нормально, за исключением одной проблемы, с которой я столкнулся. Мой RegEx неправильно изменяет фразуИнструктор по информационным технологиям 2и превращает его вIT-инструктор(из-за пробела и затем словаИнструктор, который начинается сячто то же самое, что и римская цифра один). Я пытался найти ответ в Интернете и перепробовал много вариантов, чтобы заставить RegEx исключить фразуИнструкторв поиске, но я не могу заставить его работать. Некоторые из шаблонов, которые я пытался использовать, включают:

        .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

И поскольку мне нужно удалить римскую цифру один (I), я не могу использовать следующее в качестве обходного решения:

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

Можно ли исключить строку (например, Instructor) из поиска с помощью регулярных выражений VBA Excel 2016? Если да, может ли кто-нибудь указать мне правильное направление, как исключить элементы во время VBA RegEx?

Спасибо

решение1

Я разобрался. Мне подходит следующий синтаксис (много проб и ошибок):

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

-- ОТРЕДАКТИРОВАНО, чтобы добавить подробности ниже --

Я добавил дополнительное слово (т.е.Информация) к исключению RegEx:

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

Подробности узора:

  • \b - Установить границу слова
  • (?!(?:Info|Instructor)\b) - Ноль или одно (?) исключение (!) для следующих слов. Незахватывающая группа, потому что они нам не нужны. \b в конце - это граница слова
  • (?:[0-9]+|\s[i]+|\s[iv]$) - Соответствует одной или нескольким цифрам от 0 до 9. Соответствует пробелу (\s), за которым следует один или несколько символов i. Соответствует пробелу, за которым следует iv ($ означает поиск в конце)
  • | = ИЛИ (используется везде)
  • \b - Конечная граница слова

-- ОТРЕДАКТИРОВАНО, потому что в конечном итоге это сработало для меня лучше всего --

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

Связанный контент