Первый выстрел: отфильтровать полные прописные слова
Этот ответ еще не идеален, но использование отрицательного упреждения в начале выражения может позволить вам отфильтроватьIF
и любая последовательность из 3+ букв верхнего регистра:
(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?:?\$?\b[A-Z]\$?[A-Z]?(\$?[1-9]\$?[0-9]?)?\b
* В нескольких местах \b
означает, что положительные и отрицательные совпадения идут от начала последовательности букв до конца.
Проблема, которая остается, состоит в том, что она соответствует Account_List_S!$AA:$AC
в двух совпадениях, Account_List_S!$AA
и :$AC
.Итак ...
Второй выстрел: исправить положительное совпадение части регулярного выражения
Вот более сложная версия, которая правильно соответствует диапазонам:
EDIT: исправлено для обработки примеров, приведенных OP в комментариях.
(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?\$?\b[A-Z]{1,3}(\$?[1-9]{1,3})?(:\$?[A-Z]{1,3}(\$?\d{1,3})?)?\b
С этой версией Account_List_S!$AA:$AC
сопоставляется в целом, как я полагаю, вы хотите, и добавляется Calc_Named_HC!AE$32:AE$103
в комментариях ниже.
Третий снимок: принимает некоторые ложные шаблоны, но легче для чтения
Если вы готовы принять совпадение с лишним :
перед первым адресом, это более простое выражение будет работать:
EDIT: исправлено для обработки примеров, приведенных в комментариях.
(?!\b[A-Z]{3,}\b|\bIF\b)(\b[A-z]{2,}!)?(:?\$?\b[A-Z]{1,3}(\$?\d{1,3})?){1,2}\b
Обратите внимание, что я сохранил ваш диапазон [A-z]
как есть, но [A-Za-z_]
может быть более уместным, как указал @ sp00m в своем комментарии.