Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
(w{2}d{5})|(w{2}d{5}–d{4})
и
(w{2}d{5})(–d{4})?
Как и фигурные скобки при обозначении счетчиков (например, w{2}), знак вопроса (?) используется как суффикс. Например, (–d{4})? означает “необязательно –d{4}”; т.е. мы интерпретируем четыре цифры, перед которыми стоит дефис, как суффикс. На самом деле мы не используем круглые скобки для выделения пятизначного почтового кода ZIP (w{2}d{5}) для выполнения какой-либо операции, поэтому их можно удалить.
w{2}d{5}(–d{4})?
Для того чтобы завершить наше решение задачи, поставленной в разделе 23.5, можем добавить необязательный пробел после двух букв.
w{2} ?d{5}(–d{4})?
Запись “?” выглядит довольно странно, но знак вопроса после пробела указывает на то, что пробел является необязательным. Если бы мы хотели, чтобы пробел не выглядел опечаткой, то должны были бы заключить его в скобки.
w{2}( )?d{5}((–d{4})?
Если бы кто-то сказал, что эта запись выглядит слишком неразборчивой, то нам пришлось бы придумать обозначение для пробела, например s (s — от слова “space”). В этом случае запись выглядела бы так:
w{2}s?d{5}(–d{4})?
А что если кто-то поставит два пробела после букв? В соответствии с определенным выше шаблоном это означало бы, что мы принимаем коды TX77845 и TX 77845, но не TX 77845. Это неправильно.
Нам нужно средство, чтобы сказать “ни одного, один или несколько пробелов”, поэтому мы вводим суффикс *.
w{2}s*d{5}(–d{4})?

23.7. Поиск с помощью регулярных выражений
Теперь применим шаблон почтовых кодов ZIP из предыдущего раздела для поиска почтовых кодов в файле. Программа определяет шаблон, а затем ищет его, считывая файл строка за строкой. Когда программа находит шаблон в какой-то строке, она выводит номер строки и найденный код.
#include <boost/regex.hpp>
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
ifstream in("file.txt"); // файл ввода
if (!in) cerr << "нет файла n";
boost::regex pat ("\w{2}\s*\d{5}(–\d{4})?"); // шаблон
// кода ZIP
cout << "шаблон: " << pat << 'n';
int lineno = 0;
string line; // буфер ввода
while (getline(in,line)) {
++lineno;
boost::smatch matches; // записываем сюда совпавшие строки
if (boost::regex_search(line, matches, pat))
cout << lineno << ": " << matches[0] << 'n';
}
}
Эта программа требует объяснений. Сначала рассмотрим следующий фрагмент:
#include <boost/regex.hpp>
...
boost::regex pat ("\w{2}\s*\d{5}(–\d{4})?"); // шаблон кода ZIP
boost::smatch matches; // записываем сюда совпавшие строки
if (boost::regex_search(line, matches, pat))
Мы используем реализацию библиотеки Boost.Regex, которая скоро станет частью стандартной библиотеки. Для того чтобы использовать библиотеку Boost.Regex, ее необходимо инсталлировать. Для того чтобы показать, какие возможности относятся к библиотеке Boost.Regex, мы явно указываем пространство имен boost в качестве квалификатора, т.е. boost::regex.
Вернемся к регулярным выражениям! Рассмотрим следующий фрагмент кода:
boost::regex pat ("\w{2}\s*\d{5}(–\d{4})?");
cout << "шаблон: " << pat << 'n';
Здесь мы сначала определили шаблон pat (типа regex), а затем вывели его на печать. Обратите внимание на то, что мы написали:
\w{2}\s*\d{5}(–\d{4})?
Если бы вы запустили программу, то увидели бы на экране следующую строку:
pattern: w{2}s*d{5}(–d{4})?
В строковых литералах языка С++ обратная косая черта означает управляющий символ (раздел A.2.4), поэтому вместо одной обратной косой черты () в литеральной строке необходимо написать две (\).

boost::smatch matches;
if (boost::regex_search(line, matches, pat))
cout << lineno << ": " << matches[0] << 'n';

Переменная matches имеет тип smatch. Буква s означает “sub.” По существу, тип smatch представляет собой вектор частичных совпадений. Первый элемент matches[0] представляет собой полное совпадение. Мы можем интерпретировать элемент matches[i] как строку, если i<matches.size(). Итак, если для данного регулярного выражения максимальное количество частичных шаблонов равно N, выполняется условие matches.size()==N+1.

while (getline(in,line)) {
boost::smatch matches;
if (boost::regex_search(line, matches, pat)) {
cout << lineno << ":
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Гость Татьяна24 сентябрь 22:20 Как то не очень... Невеста по ошибке. Я не дам тебе развод - Майя Линн
-
Римма24 сентябрь 21:52 Почему главные героинитпкие идиотки? И сюжет не плохой, и написано хорошо. Но как героиня - так дура дурой.... Хозяйка маленького дома, или Любимая для дракона - Кира Рамис
-
Римма20 сентябрь 12:27 Много ненужных пояснений и отступлений. Весь сюжет теряет свою привлекательность. Героиня иногда так тупит, что читать не... Хозяйка приюта для перевертышей и полукровок - Елена Кутукова