У меня есть функция внутри макроса, использующая регулярное выражение в Excel 2016 (VBA), которая должна удалить все цифры из текста, чтобы я в основном получал только буквенные символы. Суть в том, что эти цифры не просто цифры, но они также могут быть римскими цифрами (включая римские цифры от 1 до 4, то есть 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 неправильно изменяет фразу IT Instructor 2 и превращает ее в ITnstructor (из-за пробела, а затем слова Instructor, которая начинается с I, который совпадает с римской цифрой один). Я попытался найти ответ в Интернете и протестировал множество вариантов, чтобы 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

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

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

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

Спасибо

1 ответ1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .