Кроме текста в языке 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

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

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

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

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

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

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

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

спасибо

27
задан STGdb
20.05.2023 9:31 Количество просмотров материала 2376
Распечатать страницу

1 ответ

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

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

-- отредактировано, чтобы добавить детали ниже --

я добавил дополнительное слово (например, Info) для исключения регулярных выражений:

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

детали рисунка:

  • \b - установить границу слова
  • (?!(?: Инфо / инструктор)\b) - ноль или один (?) исключения (!) для следующих слов. Группа без захвата потому что мы не хотим их. \B в конце-это слово boundry
  • (?:[0-9]+ / \s[i]+ / \s[iv]$) - сопоставить одну или несколько цифр 0-9. Соответствовать пробел (\S), а затем один или более символов. Матч пробел, а затем iv ($говорит поиск в конце)
  • / = или (используется повсеместно)
  • \b-граница конечного слова

-- отредактировано, потому что в конечном счете, это сработало лучше всего для меня--

        .Pattern = "\b(?:[0-9]+|\s[i]+|\s[iv]+$)\b"
1
отвечен STGdb 2023-05-21 17:19

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх