Напишем функцию valid()
, используя операции типа соответствия, приведенные в табл. 17.11. Не следует забывать, что схема pattern
состоит из семи подвыражений. В результате каждый объект класса smatch
будет содержать восемь элементов ssub_match
. Элемент [0]
представляет общее соответствие, а элементы [1] - [7]
представляют каждое из соответствующих подвыражений.
Таблица 17.11. Операции с типом соответствия
Эти операции применимы к типам ssub_match , csub_match , wssub_match и wcsub_match | |
---|---|
matched | Открытая логическая переменная-член, означающая соответствие объекта класса ssub_match |
first second | Открытые переменные-члены, являющиеся итераторами на начало последовательности соответствия и ее следующий элемент после последнего. Если соответствия нет, то first и second равны |
length() | Размер текущего объекта соответствия. Возвращает 0, если переменная-член matched содержит значение false |
str() | Возвращает строку, содержащую соответствующую часть ввода. Возвращает пустую строку, если переменная-член matched содержит значение false |
s = ssub | Преобразует объект ssub класса ssub_match в строку s . Эквивалент вызова s = ssub.str() . Оператор преобразования не является явным (см. раздел 14.9.1) |
Когда происходит вызов функции valid()
, известно, что общее соответствие имеется, но неизвестно, какие из необязательных подвыражений являются частью этого соответствия. Переменная-член matched
класса ssub_match
, соответствующая определенному подвыражению, содержит значение true
, если это подвыражение является частью общего соответствия.
В правильном номере телефона код города либо полностью заключается в скобки, либо не заключается в них вообще. Поэтому действие функции valid()
зависит от того, начинается ли номер с круглой скобки или нет:
bool valid(const smatch& m) {
//
if (m[1].matched)
//
//
return m[3].matched
&& (m[4].matched == 0 || m[4].str() == " ");
else
//
//
//
return !m[3].matched
&& m[4].str() == m[6].str();
}
Начнем с проверки соответствия первому подвыражению (т.е. открывающей скобки). Это подвыражение находится в элементе m[1]
. Если это соответствие есть, то номер начинается с открывающей скобки. В таком случае номер будет допустимым, только если подвыражение после кода города также будет соответствующим (т.е. будет закрывающая скобка после кода города). Кроме того, если скобки в начале номера корректны, то следующим символом должен быть пробел или первая цифра следующей части номера.
Если элемент m[1]
не соответствует (т.е. открывающей скобки нет), то подвыражение после кода города также должно быть пустым. Если это так и если остальные разделители совпадают, то номер допустим, но не в противном случае.
Упражнение 17.19. Почему можно вызывать функцию m[4].str()
без предварительной проверки соответствия элемента m[4]
?
Упражнение 17.20. Напишите собственную версию программы для проверки номеров телефонов.
Упражнение 17.21. Перепишите программу номеров телефонов из раздела 8.3.2 так, чтобы использовать функцию valid()
, определенную в этом разделе.
Упражнение 17.22. Перепишите программу номеров телефонов так, чтобы она позволила разделять три части номера телефона любыми символами.
Упражнение 17.23. Напишите регулярное выражение для поиска почтовых индексов. У них может быть пять или девять цифр. Первые пять цифр могут быть отделены от остальных четырех тире.