Vba регулярные выражения примеры

Что такое регулярные выражения (regular expressions)?

Регулярные выражения — это очень мощный механизм для обработки строк. С его помощью можно легко найти нужные части текста, проверить, удовлетворяет ли строка определённой маске, и т.д. и т.п. Такие выражения втроены во многие языки программирования, такие, как Perl, Php, JavaScript.

Что необходимо следать, чтобы такие выражения использовать в VB?

Для использования регулярных выражений в своих программах, необходимо подключить библиотеку Microsoft Windows Script. Такая библиотека поставляется с IE4 (и выше). Для подключения, зайдите в Project->References и поставьте флажок у VBScript Regular Expressions. Теперь к Visual Basic добавился объект RegExp, который содержит в себе все, что нужно для работы с регулярными выражениями.

Как использовать объект объект RegExp?

Для начала, необходимо объявить объектную переменную RegExp:

Dim myRegExp As New RegExp

Этот объект имеет следующие свойства и методы:

Global — если Global = True, то поиск ведётся во всей строке, если False, то только до первого совпадения.

IgnoreCase — игнорировать ли регистр символов при поиске.

Pattern — это свойство задаёт шаблон (маску) для поиска.

MultiLine — определяет, является ли текст многострочным или нет.

Test — этот метод имеет следующий синтаксис:

Function Test(sourceString As String ) As Boolean

Метод Test позволяет протестировать строку sourceString на соответствие её шаблону (Pattern). Возвращается Boolean, True — соответсвует, False — нет.

Execute — этот метод имеет следущий синтаксис:

Function Execute(sourceString As String ) As MatchCollection

MatchCollection — это коллекция совпадений, которая содержит в себе всю информацию о всех совпадениях регулярного выражения в строке sourceString . Метод Execute может быть использован, например, для извлечения всех email адресов из строки sourceString .

Replace — этот метод имеет следующий синтаксис:

Function Replace(sourceString As String , replaceVar) _
As String

Метод Replace даёт возможность заменить все совпадения регулярного выражения строкой replaceVar .

Примеры использования регулярных выражений

Dim myRegExp As New RegExp ‘ создаём экземпляр RegExp’a
myRegExp.MultiLine = False ‘ текст однострочный
myRegExp.Global = True ‘ будем проходить всю строку
myRegExp.IgnoreCase = True ‘ игнорируем регистр символов
myRegExp.Pattern = " " ‘ маска

Dim aMatch As Match ‘ один из совпавших образцов
Dim colMatches As MatchCollection ‘ коллекция этих образцов
Dim testString As String ‘ тестируемая строка

" ‘ текст для теста

Set colMatches = myRegExp.Execute(testString) ‘ запускаем!

For Each aMatch In colMatches ‘ проходим по всей коллекции
&nbsp&nbsp&nbsp&nbspList1.AddItem aMatch.FirstIndex
&nbsp&nbsp&nbsp&nbspList1.AddItem aMatch.Length
&nbsp&nbsp&nbsp&nbspList1.AddItem aMatch.SubMatches(0)
&nbsp&nbsp&nbsp&nbspList1.AddItem aMatch.Value
Next aMatch

В результате выполнения такого кода в ListBox (List1) добавятся вот такие строчки:

Первая — число 6 (FirstIndex) — это номер первого совпавшего символа (т.е. симола b)

Вторая строка — 46 (Length) — длина совпавшего образца.

Третья строка:
"bgcolor=#FFAABB>

". Это первый совпавший образец (1), т.е. текст, попавший в скобки (.*) в маске. Для 2 нужно смотреть SubMatches(1) и т.д.

И последняя строка:
"

Теперь, давайте, к примеру, изменим маску (регулярное выражение) так, чтобы из текста получить hex цвет (#XXXXXX). Маска может выглядить так:

Запустите и посмотрите что будет. Свойство SubMatches(0) вернёт вам строку — "#FFAABB", т.е. как раз то, что мы искали. Кстати, свойство Value вернёт вам такую же строку.

Рассмотрим пример использования метода Test:

Dim myRegExp As New RegExp
myRegExp.MultiLine = False
myRegExp.Global = True
myRegExp.IgnoreCase = True
myRegExp.Pattern = "(#[0-9A-F]<6>)"

If myRegExp.Test(testString) Then
&nbsp&nbsp&nbsp&nbspMsgBox "Совпала!"
Else
&nbsp&nbsp&nbsp&nbspMsgBox "Не совпала."
End If

Читайте также:  Днс переходник sata ide

Здесь мы проверяем, совпала ли строка с регулярным выражением или нет.

И наконец, последний пример. Давайте заменим текст, находящийся в тегах

на другой текст:

"
List1.AddItem myRegExp.Replace(testString, _
"

Новый текст в теге P!

В данном случае в тестируемой строке будет только одна пара

. Но вы можете сами добавить ещё одну пару и проверить работоспособность кода.

Синтаксис регулярных выражений

Здесь я разместил очень краткое описание синтаксиса регулярных выражений, т.к. подробное описание заняло бы не один десяток страниц. На эту тему была выпущена книга "Mastering Regular Expressions". Более подробное описание вы можете найти на специализированных сайтах. (www.perl.com, к примеру).

Множитель. Определяет ни одного или несколько символов, стоящих перед ним. Пример:

"ab*c" — символ a, затем ни одного или несколько символов b, и символ c.

Точка — любой одиночный символ, кроме символа новой строки. Например:

"a." — символ a, за который следует любой одиночный символ.

Скобки использутся для задания класса символов. Например:

"[0-9A-F]" — соответствует одному hex символу. Заметьте, что 9-0 использовать нельзя! Символы должны идти обязательно по возрастающей.

Класс отрицания. Например:

"[^A-Z]" — соответствует любому символу, крому любой заглавной латинской буквы.

Любой буквенно-циферный символ. Фактически аналог класса:

Аналог "[^a-zA-Z0-9_]"

Любая цифра: "[0-9]". Например

"dd.dd.dddd" — соответствует дате. Заметьте, что перед точкой нужно поставить обратную косую черту . Это говорит о том, что точку мы хотим интерпретировать именно как точку, а не как спец. символ — точку.

Аналог "[^0-9_]". Т.е. всё, кроме цифр. Пробельный символ "[

f]". Непробельный символ "[^

f]".

Тоже множитель (как и *), но определяет один или более символов. Например:

"ab+c" — символ a, один или более символов b и затем символ c.

Прожорливость. Например, выше, для замены текста внутри тегов

мы использовали следующую маску: "

". После * мы поставили знак вопроса. Если бы мы этого не сделати, что произошла бы замена всего того, что находится от первого тега

. А так, происходит замена только до следующего тега.

Ещё несколько примеров регулярных выражений:

"(два|три) богатыря"
соответствует как строке "два богатыря", так и "три богатыря".

".+@.+..+" — соответствует email адресу.

"a(.)1c" — соответствует одному символу a, затем любым 2-м одинаковым символам, и затем символу с. Т.е. совпадёт "axxc", то не "axyc".

"(dd).1.dddd" — соответствует дате, у которой число и месяц одинаковы. Т.е. дата "09.09.2001" — подойдёт, а дата "09.12.2001" — нет. Ну и т.п.

Регулярные выражения в VBA Excel. Объекты RegExp, Match, Matches Collection и их свойства. Символы и метасимволы. Создание объекта RegExp с ранней, поздней привязкой и его методы.

Регулярные выражения (по Википедии — формальный язык поиска и осуществления манипуляций с подстроками в тексте), необходимы для обработки текстов с помощью шаблонов, состоящих из символов и метасимволов, и представлены объектом RegExp.

В VBA Excel для работы с регулярными выражениями используется библиотека «Microsoft VBScript Regular Expression».

Создание объекта RegExp

Ранняя привязка

Обычно рекомендуется использовать объекты с ранней привязкой, так как у них выше быстродействие, а также при написании и редактировании кода доступны подсказки в виде листа свойств-методов, появляющегося автоматически или вызываемого, при необходимости, сочетанием клавиш Ctrl+Пробел.

Раннее связывание заключается в присвоении нового экземпляра объекта RegExp переменной, уже объявленной, как переменная определенного типа (в нашем случае, как RegExp).

Для осуществления ранней привязки необходимо подключить к проекту VBA ссылку на библиотеку «Microsoft VBScript Regular Expression», для чего в редакторе VBA выбираем Tools — References.

В открывшемся окне «References» находим строку «Microsoft VBScript Regular Expression 5.5» (если у вас ее нет, то строку «Microsoft VBScript Regular Expression 1.0»), отмечаем ее галочкой и нажимаем «ОК».

Готово — ссылка добавлена.

Читайте также:  Canon m6 или sony a6000

Создание объекта RegExp с ранней привязкой:

Поздняя привязка

Позднее связывание заключается в присвоении нового экземпляра объекта RegExp переменной, объявленной как Object, с помощью функции CreateObject.

Создание объекта RegExp с поздней привязкой:

Свойства и методы объекта RegExp

Свойства объекта RegExp

Свойство Описание Значение
по умолчанию Global Определяет продолжительность поиска:
False — до первого совпадения
True — по всему тексту False IgnoreCase Определяет чувствительность к регистру символов:
False — учитывать регистр
True — не учитывать регистр False Multiline Определяет структуру объекта:
False — однострочный
True — многострочный False Pattern Строка, используемая как шаблон Пустая строка

Свойства объекта RegExp доступны для чтения и записи.

Методы объекта RegExp

Метод Синтаксис Описание
Execute Execute(myStr)
myStr — строка для поиска
Возвращает коллекцию найденных по шаблону подстрок в виде агрегатного объекта
Replace Replace(myStr,myRep)
myStr — строка для поиска
myRep — строка для замены
Возвращает строку, в которой найденные по шаблону вхождения в исходной строке заменены на указанную подстроку.
Test Test(myText)
myText — строка для проверки
Возвращает булево значение как результат проверки соответствия строки шаблону

Свойства объектов Match и Matches Collection

Метод Execute объекта RegExp возвращает агрегатный объект Matches Collection, который содержит коллекцию объектов Match, представляющих все совпадения, найденные механизмом регулярных выражений, в том порядке, в котором они присутствуют в исходной строке. Если совпадений нет, метод возвращает объект Matches Collection без членов.

Свойства объекта Matches Collection

Свойство Описание
Count Количество объектов Match, содержащихся в объекте Matches Collection
Item Индекс члена коллекции от нуля до значения свойства Count минус 1

Свойства объекта Matches Collection доступны только для чтения.

Свойства объекта Match

Свойство Описание
FirstIndex Позиция в исходной строке, где произошло совпадение, причем первая позиция в строке равна нулю
Length Длина совпавшей подстроки
Value Найденная подстрока (является свойством по умолчанию)

Свойства объекта Match доступны только для чтения.

Символы и метасимволы

Все знаки, используемые для составления шаблонов, обычно делят на символы и метасимволы. Символы — это знаки, которые в шаблонах обозначают сами себя, а метасимволы (спецсимволы) — знаки, имеющие другое значение. Метасимволы могут использоваться как отдельно, так и в сочетании с другими символами и спецсимволами.
Таблица основных метасимволов и их сочетаний с другими символами

Метасимвол
(сочетание символов)
Значение
После этого знака метасимвол обозначает сам себя, а некоторые символы приобретают другое значение
^ Начало строки
$ Конец строки
? Ни одного или один любой символ
* Ни одного или несколько любых символов
+ Один или несколько любых символов
. Любой символ, кроме знака "новая строка"
Определяет интервал символов
| Знак "или"
Точное количество символов, стоящих перед
Количество от n до m символов, стоящих перед
[abc] Любой из указанных символов
[^abc] Любой из неуказанных символов
[a-z] Любой символ из диапазона
[^a-z] Любой символ, не входящий в диапазон
 Конец слова
B Не конец слова
d Цифра
D Не цифра
w Любая буква, цифра или знак подчеркивания
W Не буква, не цифра и не знак подчеркивания
s Пробел
S Не пробел

В таблицу не включены редко используемые сочетания, ознакомиться с которыми можно в справочной системе разработчика. А примеры использования метасимволов в шаблонах очень хорошо представлены на этом ресурсе в разделе 4. Метасимволы.

Обо всём, что мне интересно

Использование регулярных выражений в VBA для извлечения текста из сообщений Outlook

Есть несколько способов поиска определённого текста в теле письма с помощью VBA. Можно воспользоваться функциями InStr, Len, Left или Right, чтобы найти и извлечь текст, а можно воспользоваться регулярными выражениями. Именно о применении регулярных выражений в коде VBA пойдёт речь в данной статье.

Например, требуется извлечь код отслеживания посылки UPS, отправленной с Amazon.com. Такой код имеет формат как на скриншете ниже:

Нужно находить в тексте слова «Carrier Tracking ID», затем, возможно, пробел и двоеточие.

Читайте также:  Как выложить музыку в вк с телефона

.Pattern = "(Carrier Tracking IDs*[:]+s*(w*)s*)"

Такое выражение извлечёт из текста из примера цифро-буквенный код 1Z2V37F8YW51233715.

Используйте s* для определения неизвестного количества пробелов (пробелы, символы табуляции, перевода строки и т.д.)
Используйте d* для определения только цифр
Используйте w* для определения цифро-буквенных символов, как используются в кодах отслеживания посылок UPS.

Чтобы использовать этот образец кода откройте редактор VBA с помощью комбинации Alt+F11. Правой кнопкой мыши нажмите на Проекте и выберите Insert > Module. Скопируйте и вставьте код макроса в модуль. Для работы макроса нужно задействовать библиотеку Microsoft VBScript Regular Expressions 5.5 в меню Tools -> References… VBA-редактора:

Если включена библиотека VBScript Expressions 1, то отключите её сняв соответствующую галочку. Невозможно одновременно использовать v1 и v5.5.

Sub GetValueUsingRegEx() ‘ Подключите библиотеку VB Script ‘ Microsoft VBScript Regular Expressions 5.5 Dim olMail As Outlook.MailItem Dim Reg1 As RegExp Dim M1 As MatchCollection Dim M As Match Set olMail = Application.ActiveExplorer().Selection(1) ‘ Debug.Print olMail.Body Set Reg1 = New RegExp ‘ s* = скрытые пробелы ‘ d* = цифры ‘ w* = цифро-буквенные выражения With Reg1 .Pattern = "Carrier Tracking use M.SubMatches(2) for the second one if you have two (w*) Debug.Print M.SubMatches(1) Next End If End Sub

Если будем искать только двоеточие .Pattern ="([:]+s*(w*)s*)" , тогда код вернёт только первое слово после двоеточия из каждой строки:

UPS
May
Standard
1Z2V37F8YW51233715
Diane

Это потому, что (w*) указывает, что нужно получить следующую после двоеточия цифро-буквенную строку, не всю строку, и не включать пробелы.

Получение двух и более значений из сообщения

Если вам требуется использовать два или несколько шаблонов, то можно повторить часть c With Reg1 до End If, для каждого из шаблонов или воспользоваться оператором Case.

Код ниже осуществляет поиск по трём шаблонам, создает строку и добавляет ее в поле темы сообщения. Каждый Case представляет свой шаблон. В этом примере отыскивается только первое вхождение каждого шаблона. .Global = False указывает, что нужно остановиться, когда находится первое совпадение.

Данные, которые мы ищем имеют следующий формат:

Order ID : VBNSA-123456
Order Date: 09 AUG 2013
Total $54.65

/n в конце шаблона соответствует концу строки, а strSubject = Replace(strSubject, Chr(13), "") удаляет любые переносы строки.

Sub GetValueUsingRegEx() Dim olMail As Outlook.MailItem Dim Reg1 As RegExp Dim M1 As MatchCollection Dim M As Match Dim strSubject As String Dim testSubject As String Set olMail = Application.ActiveExplorer().Selection(1) Set Reg1 = New RegExp For i = 1 To 3 With Reg1 Select Case i Case 1 .Pattern = "(Order & Trim(strSubject) Debug.Print i & testSubject Next End If Next i Debug.Print olMail.Subject & testSubject olMail.Subject = olMail.Subject & testSubject olMail.Save Set Reg1 = Nothing End Sub

Использование функции RegEx

Эта функция позволяет использовать регулярное выражение в более чем одном макросе.

Если вам нужно использовать более чем один шаблон с функцией, задайте для шаблон в макросе regPattern = "([0-9]<4>)" и используйте это в функции: regEx.Pattern = regPattern . Не забудьте добавить Dim regPattern As String в верхней части модуля.

Function ExtractText(Str As String) ‘ As String Dim regEx As New RegExp Dim NumMatches As MatchCollection Dim M As Match ‘этот шаблон ищет 4 подряд идущие цифры в теме письма regEx.Pattern = "([0-9]<4>)" ‘ используейте это, если нужно задвать разные шаблоны ‘ regEx.Pattern = regPattern Set NumMatches = regEx.Execute(Str) If NumMatches.Count = 0 Then ExtractText = "" Else Set M = NumMatches(0) ExtractText = M.SubMatches(0) End If code = ExtractText End Function

Этот макрос показывает, как использовать функцию Regex. Если в теме письма есть соответствующая шаблону комбинация (в пример функции, 4-х значное число), то будет создан ответ. Если нет, то появляется окно с сообщением. Чтобы использовать функцию с разными макросами, раскомментируйте строки, содержащие regPattern.