Шаблон типа regex на самом деле является разновидностью объекта класса “1 string, поэтому мы можем вывести его на печать с помощью оператора <<.
Класс regex — это не просто разновидность класса string, но его довольно сложный механизм сопоставления шаблонов, созданных при инициализации объекта класса regex (или при выполнении оператора присваивания), выходит за рамки рассмотрения нашей статьи.
Однако, поскольку мы инициализировали объект класса regex шаблоном почтовых кодов, можем применить его к каждой строке нашего файла.
Функция regex_search(line, matches, pat) ищет в строке line любое соответствие регулярному выражению, хранящемуся в объекте pat, и если она находит какое-либо соответствие, то сохраняет его в объекте matches. Естественно, если соответствие не обнаружено, функция regex_search(line, matches, pat) возвращает значение false.
Переменная matches имеет тип smatch. Буква s означает “sub.” По существу, тип smatch представляет собой вектор частичных совпадений. Первый элемент matches[0] представляет собой полное совпадение. Мы можем интерпретировать элемент matches[i] как строку, если i < matches.size(). Итак, если для данного регулярного выражения максимальное количество частичных шаблонов равно N, выполняется условие matches.size()==N+1.
Что такое частичный шаблон (sub-pattem)? Можно просто сказать: “Все, что заключено в скобки внутри шаблона”. Глядя на шаблон "\\w{2}\\s* \\d{5}(-\\d{4})?M, мы видим скобки вокруг четырехзначного кода ZIP. Таким образом, мы видим только один частичный шаблон, т.е. matches.size()==2. Кроме того, можно догадаться, что у нас есть простой доступ к этим четырем последним цифрам. Рассмотрим пример.
while (getline(in,line)) {
boost::smatch matches; if (boost::regex_search(line, matches, pat)) {
cout << lineno << ": M << matches[0] << '\n'; // полное
// совпадение
if (1
cout << M\t: M << matches[1] << '\n'; // частичное
// совпадение
}
}
Опубликовал katy
April 20 2015 08:40:08 ·
0 Комментариев ·
1867 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.