У меня есть функция внутри макроса, использующая регулярное выражение в 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"