Как я могу использовать регулярные выражения в Excel и использовать мощные сетчатые настройки Excel для манипулирования данными?
- Функция в ячейке, чтобы возвратить совпавший образец или замененное значение в строке.
- Sub для циклического перебора столбца данных и извлечения совпадений для соседних ячеек.
- Какая настройка нужна?
- Каковы специальные символы Excel для регулярных выражений?
Я понимаю , Regex не является идеальным для многих ситуаций ( использовать или не использовать регулярные выражения? ) , Так как Excel можно использовать Left
, Mid
, Right
, Instr
команды типа для подобных манипуляций.
Like
операторе , который предоставляет своего рода облегченную версию функциональности в стиле регулярных выражений. Как правило, это намного быстрее, чем регулярное выражение, даже если обернут в процедуру sub или функции.Ответы:
Регулярные выражения используются для сопоставления с образцом.
Чтобы использовать в Excel, выполните следующие действия:
Шаг 1. Добавьте ссылку на VBA в «Регулярные выражения Microsoft VBScript 5.5»
Шаг 2 : Определите свой шаблон
Основные определения:
-
Спектр.a-z
соответствует строчным буквам от а до я0-5
соответствует любое число от 0 до 5[]
Совпадение точно с одним из объектов в этих скобках.[a]
соответствует букве а[abc]
соответствует одной букве, которая может быть a, b или c[a-z]
соответствует любой строчной букве алфавита.()
Группы разных совпадений для целей возврата. Смотрите примеры ниже.{}
Множитель для повторных копий шаблона, определенного перед ним.[a]{2}
соответствует две последовательные строчные буквы:aa
[a]{1,3}
соответствует по крайней мере , один и до три строчной буквыa
,aa
,aaa
+
Сопоставьте хотя бы один или несколько шаблонов, определенных перед ним.a+
будет соответствовать последовательным элементам аa
,aa
,aaa
и т.д.?
Совпадение нуля или одного из шаблонов, определенных перед ним.[a-z]?
соответствует пустой строке или любой отдельной строчной букве.*
Сопоставьте ноль или более шаблона, определенного перед ним. - Например, подстановочный знак для шаблона, который может присутствовать или не присутствовать. - Например,[a-z]*
соответствует пустой строке или строке строчных букв..
Соответствует любому символу, кроме новой строки\n
a.
Соответствует двухсимвольной строке, начинающейся с a и заканчивающейся чем угодно, кроме\n
|
Оператор ИЛИa|b
означает либоa
илиb
может быть сопоставлено.red|white|orange
соответствует точно один из цветов.^
НЕ оператор[^0-9]
символ не может содержать число[^aA]
символ не может быть строчнымa
или прописнымA
\
Выход из специального символа, который следует (переопределяет поведение выше)\.
,\\
,\(
,\?
,\$
,\^
Закрепление паттернов:
^
Совпадение должно происходить в начале строки^a
первый символ должен быть строчной буквойa
^[0-9]
первый символ должен быть числом.$
Соответствие должно происходить в конце строкиa$
последний символ должен быть строчной буквойa
Таблица приоритетов:
Предопределенные сокращения символов:
Пример 1 : Запуск от имени макроса
В следующем примере макроса выполняется поиск значения в ячейке,
A1
чтобы определить, являются ли первые 1 или 2 символа цифрами. Если это так, они удаляются, и отображается остальная часть строки. Если нет, то появится окно, сообщающее, что совпадений не найдено. ВернутсяA1
значения ячеек12abc
, вернетсяabc
значение1abc
, вернетсяabc
значениеabc123
«Не соответствует», потому что цифры не были в начале строки.Пример 2 : Запуск в качестве функции в ячейке
Этот пример аналогичен примеру 1, но настроен для запуска в качестве функции в ячейке. Чтобы использовать, измените код на это:
Поместите свои строки ("12abc") в клетку
A1
. Введите эту формулу=simpleCellRegex(A1)
в ячейку,B1
и результат будет «abc».Пример 3 : проходной цикл
Этот пример аналогичен примеру 1, но проходит через ряд ячеек.
Пример 4 : Разделение разных шаблонов
В этом примере выполняется циклический просмотр диапазона (
A1
,A2
&A3
) и поиск строки, начинающейся с трех цифр, за которыми следует один буквенный символ, а затем 4 цифровых знака. Выходные данные разделяются на совпадения шаблона на соседние ячейки с помощью()
.$1
представляет собой первый образец согласованного в пределах первого набора()
.Результаты:
Дополнительные примеры шаблонов
источник
Set regEx = Nothing
. Вы получите исключения «Недостаточно памяти», когда этот саб выполняется достаточно часто.Set regEx = CreateObject("VBScript.RegExp")
ThisWorkbook
. Попробуйте переместить код в отдельныйModule
.Чтобы использовать регулярные выражения непосредственно в формулах Excel, может помочь следующая UDF (пользовательская функция). Он более или менее прямо представляет функцию регулярного выражения как функцию Excel.
Как это работает
Требуется 2-3 параметра.
$0
,$1
,$2
и так далее.$0
является полным соответствием,$1
и up соответствуют соответствующим группам соответствия в регулярном выражении. Значения по умолчанию для$0
.Некоторые примеры
Извлечение адреса электронной почты:
Результаты в:
some@email.com
Извлечение нескольких подстрок:
Результаты в:
E-Mail: some@email.com, Name: Peter Gordon
Чтобы разделить объединенную строку в одной ячейке на ее компоненты в нескольких ячейках:
Результаты в:
Peter Gordon
some@email.com
...Как пользоваться
Чтобы использовать этот UDF, сделайте следующее (грубо говоря, на этой странице Microsoft . У них есть хорошая дополнительная информация!):
ALT+F11
чтобы открыть редактор Microsoft Visual Basic для приложений .Нажмите на Вставить модуль . Если вы даете модуль другое имени убедитесь , что модуль имеет не иметь такое же имя , как ОДС ниже (например , именование модуля
Regex
и функцияregex
вызывает #NAME! Ошибка).В большом текстовом окне посередине вставьте следующее:
Сохраните и закройте окно редактора Microsoft Visual Basic для приложений .
источник
Function foo() As Variant \n foo="Hello World" \n End Function
UDF, чтобы увидеть, работает ли это. Если да, переходите к полному описанному выше, если ничего не нарушено (макросы отключены?).Расширение на patszim «s ответ для тех , кто в спешке.
добавьте следующий код:
Шаблон регулярного выражения помещается в одну из ячеек, и для него используется абсолютная ссылка . Функция будет привязана к книге, в которой она создана.
Если необходимо использовать ее в разных книгах, сохраните функцию в Personal.XLSB.
источник
Вот моя попытка:
источник
Мне нужно было использовать это как функцию ячейки (например,
SUM
илиVLOOKUP
) и я обнаружил, что это легко:Создайте следующую функцию в рабочей книге или в своем собственном модуле:
Затем вы можете использовать в ячейке с
=REGPLACE(B1, "(\w) (\d+)", "$1$2")
(например: "A 243" до "A243")источник
Это не прямой ответ, но может предоставить более эффективную альтернативу для вашего рассмотрения. Это то, что Google Sheets имеет несколько встроенных функций регулярных выражений это может быть очень удобно и поможет обойти некоторые технические процедуры в Excel. Очевидно, что использование Excel на вашем компьютере имеет некоторые преимущества, но для подавляющего большинства пользователей Google Sheets предлагает идентичные возможности и может предложить некоторые преимущества в переносимости и совместном использовании документов.
Они предлагают
REGEXEXTRACT: извлекает соответствующие подстроки в соответствии с регулярным выражением.
REGEXREPLACE: заменяет часть текстовой строки другой текстовой строкой с использованием регулярных выражений.
ЗАМЕНА: заменяет существующий текст новым текстом в строке.
REPLACE: заменяет часть текстовой строки другой текстовой строкой.
Вы можете напечатать их прямо в ячейку, и вы получите все, что захотите.
Они также довольно хорошо работают в сочетании с другими функциями, такими как операторы IF, например:
Надеемся, что это обеспечивает простой обходной путь для пользователей, которые чувствуют насмешки в компоненте VBS Excel.
источник
Вот
regex_subst()
функция. Примеры:Вот упрощенный код (проще для меня, во всяком случае). Я не мог понять, как построить подходящий шаблон вывода, используя приведенное выше, чтобы работать как мои примеры:
источник
Я не хочу включать справочную библиотеку, так как мне нужно, чтобы мои сценарии были переносимыми.
Dim foo As New VBScript_RegExp_55.RegExp
Линия вызвалаUser Defined Type Not Defined
ошибки, но я нашел решение , которое работало для меня.Что вы хотите сделать, это поместить пример строки в ячейку
A1
, а затем проверить своиstrPattern
. Как только это работает, отрегулируйте тогдаrng
как желаемый.источник
VBScript_RegExp_55
библиотека в значительной степени повсеместна, поэтому имеет очень низкий риск не оказаться на конкретной целевой машине. И в любом случае, переключение с раннего связывания на позднее связывание не решает проблему переносимости (код все равно будетЧтобы добавить к ценному контенту, я хотел бы создать это напоминание о том, почему иногда RegEx в VBA не идеальны. Не все выражения поддерживаются, но вместо этого могут бросить
Error 5017
и могут оставить автора угадывать (что я жертва себя).В то время как мы можем найти некоторые источники о том, что это поддерживается, было бы полезно знать , какие метасимволы т.д., не поддерживаются. Более подробное объяснение можно найти здесь . Упоминается в этом источнике:
Итак, не поддерживаются:
\A
, альтернативно используйте^
каретку, чтобы соответствовать положению перед первым символом в строке\Z
, альтернативно используйте$
знак доллара, чтобы соответствовать положению после последнего символа в строке(?<=a)b
( в то время как Postive LookAhead это поддерживается)(?<!a)b
( в то время как отрицательное LookAhead будет поддерживается)\{uFFFF}
/i
(чувствительность к регистру) или/g
(глобальный) и т. Д. Установите их черезRegExp
свойства объекта>RegExp.Global = True
и,RegExp.IgnoreCase = True
если доступно.'
комментариями в сценарииЯ уже несколько раз ударил стену, используя регулярные выражения в VBA. Обычно с,
LookBehind
но иногда я даже забываю модификаторы. Я не испытывал все эти вышеупомянутые фоны самостоятельно, но думал, что я постараюсь быть обширным, обращаясь к некоторой более глубокой информации. Не стесняйтесь комментировать / исправить / добавить. Большой привет регулярным-expression.info для богатства информации.PS Вы упомянули обычные методы и функции VBA, и я могу подтвердить, что они (по крайней мере, для меня) по-своему помогли, когда RegEx потерпит неудачу.
источник