Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Проверка совпадения с шаблоном
В примерах предыдущего раздела мы использовали несколько методов, которые позволяли проверить совпадение с шаблоном, найти все совпадения, а также произвести замену в строке по шаблону. В этом и последующих разделах мы подробно рассмотрим все эти методы.
Проверить совпадение с шаблоном позволяет метод Test(<Строка>)
. Метод возвращает значение True
, если совпадение найдено, и False
— в противном случае. В качестве примера переделаем нашу программу (листинг 4.16) суммирования произвольного количества целых чисел, введенных пользователем, таким образом, чтобы при вводе строки вместо числа программа не завершалась с фатальной ошибкой (листинг 7.10). Кроме того, предусмотрим возможность ввода отрицательных целых чисел.
Листинг 7.10. Суммирование неопределенного количества чисел
Dim Сумма As Long, Значение As Variant, re As Variant
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^[-]?[0-9]+$"
Сумма = 0
Do
Значение = InputBox("Введите число или слово 'stop' " _
& vbCr & "для получения результата")
If Значение = "stop" Or Значение = "" Then
Exit Do ' Выход из цикла
End If
If re.Test(Значение) = False Then
MsgBox "Ошибка. Вы ввели не число"
Else
Сумма = Сумма + CLng(Значение)
End If
Loop
MsgBox "Сумма чисел равна: " & Сумма
Поиск всех совпадений с шаблоном
Найти и получить все совпадения с шаблонов позволяет метод Execute(<Строка>)
. Обратите внимание, чтобы поиск был глобальным, нужно присвоить свойству Global
значение True
, иначе по умолчанию будет найдено только первое совпадение с шаблоном. Метод возвращает коллекцию Matches
, каждый элемент которой представлен объектом Match
. Коллекция Matches
содержит следующие свойства и методы:
Count
— содержит количество элементов в коллекции;Item(<Индекс>)
— возвращает ссылку на указанный объектMatch
.
Объект Match
содержит следующие свойства:
FirstIndex
— позиция найденного фрагмента внутри строки;Length
— длина фрагмента;Value
— текст фрагмента.
Пример получения всех чисел из строки:
Dim re, Matches, Item, s As String
s = "2009, 2010, 2011, 2012"
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[0-9]+"
re.Global = True
Set Matches = re.Execute(s)
Debug.Print "Количество элементов: " & Matches.Count
' Доступ к элементу по индексу
Debug.Print Matches.Item(0).Value
' Перебор всех элементов
For Each Item In Matches
Debug.Print Item.Value; Item.FirstIndex; Item.Length
Next
' Количество элементов: 4
' 2009
' 2009 0 4
' 2010 6 4
' 2011 12 4
' 2012 18 4
Внутри шаблона могут быть расположены группы (фрагменты внутри круглых скобок). Получить доступ к этим фрагментам позволяет свойство Submatches
объекта Match
. Свойство Submatches
возвращает коллекцию, которая имеет следующие свойства и методы:
Count
— содержит количество элементов в коллекции;Item(<Индекс>)
— возвращает строку, соответствующую фрагменту внутри круглых скобок, по индексу.
Пример разбора номера телефона на составные части:
Dim re, Matches, Submatches, Item, SubItem, s As String
s = "528-22-98"
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "(([0-9]{3})-([0-9]{2})-([0-9]{2}))"
re.Global = True
Set Matches = re.Execute(s)
For Each Item In Matches
Set Submatches = Item.Submatches
Debug.Print "Количество элементов: " & Submatches.Count
' Доступ по индексу
Debug.Print Submatches.Item(0)
' Перебор всех элементов
For Each SubItem In Submatches
Debug.Print SubItem
Next
Next
' Количество элементов: 4
' 528-22-98
' 528-22-98
' 528
' 22
' 98
Замена в строке
Для замены в строке с помощью регулярных выражений предназначен метод Replace(<Строка>, <Новый фрагмент>)
. Обратите внимание, чтобы поиск был глобальным, нужно присвоить свойству Global
значение True
, иначе по умолчанию будет найдено только первое совпадение с шаблоном. Метод возвращает новую строку. Заменим все числа в строке на 0
:
Dim re
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[0-9]+"
re.Global = False
Debug.Print re.Replace("2008, 2009, 2010, 2011", "0")
' 0, 2009, 2010, 2011 (замена только первого числа!!!)
re.Global = True ' Глобальный поиск
Debug.Print re.Replace("2008, 2009, 2010, 2011", "0")
' 0, 0, 0, 0 (замена всех чисел)
Помощь сайту
Yandex-деньги: 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов