Регулярные выражения

Знакомство

Регулярные выражения - механизм, предложенный Microsoft при использовании VBScript 5.0 и выше. Данный движок можно использовать и в Visual Basic. Если вы программировали на Perl или JavaScript, то возможно уже знакомы с понятием "Регулярные выражения".

Возможности регулярных выражений

С помощью регулярных выражений вы можете

Системные требования

Регулярные выражения являются частью технологии Microsoft Windows Script Technologies и входит в VBScript. Для использования движка Регулярных выражений вам необходимо иметь библиотеку vbscript.dll (загрузить VBScript DLL вы можете с http://www.microsoft.com/msdownload/vbscript/scripting.asp). Данная библиотека включена в Internet Explorer 4 и выше.

Подключение библиотеки к Visual Basic

Откройте новый проект на Visual Basic. Далее через Project->References подключите Microsot VBScript Regular Expressions 5.5.

Теперь можно использовать объект RegExp
Dim myReg As RegExpSet MyReg = new RegExp' Устанавливаем свойства объектаMyReg.IgnoreCase = TrueMyReg.Global = TrueMyReg.Pattern = "abc" ' шаблонText1.Text = myreg.Replace(Text1.Text, "My ")
В этом примере использовали шаблон, игнорирующий регистр букв (IgnoreCase) и заменяющий все (Global) субстроки "abc" в строке с помощью метода Replace на строчку "My ". Для замены только первого вхождения субстроки установите свойство Global в False.

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

Регулярные выражения, выражаясь простым языком, - это образец текста, который состоит из одиночных обычных символов или особых, так называемых метасимволов (metacharacters). Образец описывает одну или несколько строк и служит как шаблон при поиске в заданном тексте.Для ясности, приведем несколько примеров применения шаблонов в VBScript/Visual Basic:

" \d {2}-\d {5} "
Данный шаблон проверяет правильность номера ИДЕНТИФИКАТОРА, состоящего из 2 цифр, дефиса, и еще 5 цифр
"<(.*)>.*<\/\1>"
Соответствует тегу HTML
Список метасимволов достаточно обширен. Здесь приводится только часть из них. За более полной информацией о метасимволах обращайтесь к документации.
СимволОписание
*Определяет ни одного или несколько символов, стоящих перед ним. Пример:
"ab*c" - символ a, затем ни одного или несколько символов b, и символ c
\Показывает, что следующий символ является спецсимволом, константой и т.п. Например, шаблон 'n' ищет символы "n", а '\n' уже ищет символ новой строки. Последовательность '\\' соответствует "\" и "\(" соответствует "("
^Определяет начало входной строки
$Определяет конец входной строки
+Соответствует данному выражению один или более раз. Например, zo+ соответствует "zo" и "zoo", но не "z"
.Соответствует любому символу, кроме '\n' (символа новой строки). Чтобы найти любой символ, включая \n, используйте что-нибудь вроде '[.\n]'. Например:
"a." - символ a, за который следует любой одиночный символ
x|yСоответствует одному из вариантов (x или y). Например, 'z|food' соответствует "z" или "food". '(z|f)ood' соответсвует "zood" или "food"
\dСоответствует цифре. То же, что и [0-9]
\DНе цифра. То же, что и [^0-9]
\wСоответствует любому символу слова, включая символ подчеркивания. Эквивалентно выражению '[A-Za-z0-9_]'
\sПробельный символ (space, tab, и т.п.). Эквивалентно выражению "[ \r\t\n\f]"
\SНепробельный символ. Эквивалентно выражению "[^ \r\t\n\f]"
[a-z]Диапазон символов. Соответствует любому символу в указанном диапазоне. Например, "[1-5]" соответствует числам от 1 до 5
[^a-z]Класс отрицания. Например:
"[^A-Z]" - соответствует любому символу, крому любой заглавной латинской буквы

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

Регулярные выражения имеют 4 свойства и 3 функции
Свойства
Global
Проверка на шаблон по всему тексту. По умолчанию установлен в False (до первого соответствия). Для проверки всего текста используйте True
IgnoreCase
Проверка на регистр символов. По умолчанию установлен в False (игнорировать регистр)
Pattern
Строка, используемая как шаблон. Данный шаблон необходимо создать перед использованием объекта RegExp
Multiline
Булево значение, определяющее вид объекта (многострочное или однострочное)
Функции
Function Replace(sourceString As String, replaceVar) As String
Функция использует два аргумента - заданную строку и строку для замены. Если в заданном тексте существует соответствие шаблону, то текст заменяется на второй аргумент и возвращается измененная строка. В противном случае возвращается строка-оригинал
Function Execute(sourceString As String) As Object
Аналогична функции Replace, за исключением того, что возвращается коллекция Match. Функия не изменяет первоначальную строку
Function Test(sourceString As String) As Boolean
Функция использует строку в качестве аргумента и возвращает True, если строку соответсвует шаблону, иначе возвращается False
Использование некоторых свойств и функций уже приводился в примере в начале статьи.

Еще пример. Предположим, вы хотите извлечь строку, включающую все цифры после буквы B из образца "A1234B4567"
В этом случае код будет таким:

 Dim reg As New RegExp Dim strTest As String Dim regPattern As String Dim Matches As MatchCollection Dim mtch As Match Dim blnFound As Boolean strTest = "A1234B12" regPattern = "4B\d+$" With reg     .Pattern = regPattern     MsgBox .Test(strTest)     Set Matches = .Execute(strTest)     For Each mtch In Matches         MsgBox mtch.Value     Next mtch End With Set reg = Nothing

Для пущей наглядности приведем еще один практический пример, проверяющий правильность электронного адреса. Подобная задача актуальна, например, при создании asp-страницы, которая запрашивает email посетителя и проверяет его действительность.

Dim myReg As RegExpSet myReg = New RegExpmyReg.IgnoreCase = True' Шаблон на проверку правильности эл.адреса myReg.Pattern = "^[\w-\.]+@\w+\.\w+$"If myReg.Test(Text1.Text) Then    MsgBox "Электронный адрес действителен"Else      MsgBox "Ошибка! Электронный адрес <" & Text1.Text & "> существовать не может!"End If

Еще пример. Расположите на форме два текстовых поля txtPatern и txtString. Установите у первого текстового поля свойство Text в ^([2-9]{3}-)?[2-9]{3}-\d{5}$ и пишем код

Private Sub txtString_Change()    Dim reg_exp As New RegExp    reg_exp.Pattern = txtPattern.Text    If reg_exp.Test(txtString.Text) Then        txtString.BackColor = vbWhite    Else        txtString.BackColor = vbRed    End IfEnd Sub

Расшифруем запись:

    ^             определяем начало входной строки    [2-9]{3}-     символы от 2 до 9 ровно три раза, следующих за -    ([2-9]{3}-)?  строка "[2-9]{3}-" ни разу или один раз    [2-9]{3}-     снова проверка на символы от 2 до 9 ровно 3раза, следующих за -    \d{5}         любые цифры ровно 5 раз    $             конец входной строки

Если в текстовом поле будет запись тип 555-22228 или 222-347-22225, то она станет белого цвета.

Рассмотрим пример с заменой текста. Предположим, мы хотим заменять все буквы а в словах на "о":

    On Error Resume Next    Dim reg_exp As New RegExp    reg_exp.Pattern = "[а]"    reg_exp.IgnoreCase = True    reg_exp.Global = True    txtString.Text = reg_exp.Replace(txtString.Text, "о")

Если вы введете слово малака, то данный код исправит слово на молоко.

Регулярные выражения в среде разработки Visual Basic

Регулярные выражения можно использовать и в среде разработки Visual Basic. А именно в окне поиска (Edit-Find). Предположим ваш код содержит имена переменных Command1, Command2, Command3, Command4 и т.д. Вы с помощью поиска хотите найти только слова Command1 и Command2, но не хотите искать Command3, Command4. Традиционный способ поиска по шаблону Command здесь не подойдет, так как будут найдены все слова. Здесь на помощь придут регулярные выражения. Впишите в поле поиска выражение Command[12] и поставьте галочку в Use Pattern Matching.

И будут найдены только слова Command1 и Command2. Можете использовать и другие символы регулярных выражений. Например, Command[!1-3] позволит найти любые слова Command c цифрами от 4 и далее, но не Command1, Command2, Command3!