Проверка совпадения с шаблоном

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

Проверить совпадение с шаблоном позволяет метод 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 (замена всех чисел)

Visual Basic for Applications (VBA)
Статьи по Visual Basic for Applications (VBA)

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов