Читаем Язык программирования C++. Пятое издание полностью

  "(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ])?(\\d{4})";

 regex r(phone); // regex для поиска схемы

 smatch m;

 string s;

 string fmt = "$2.$5.$7"; // переформатировать номера в ddd.ddd.dddd

 // прочитать каждую запись из входного файла

 while (getline(cin, s))

  cout << regex_replace(s, r, fmt) << endl;

 return 0;

}

Каждая запись читается в строку s и передается функции regex_replace(). Эта функция находит и преобразует все соответствия исходной последовательности.

Флаги, контролирующие соответствия и формат

Кроме флагов обработки регулярных выражений, библиотека определяет также флаги, позволяющие контролировать процесс поиска соответствия и форматирования при замене. Их значения приведены в табл. 17.13. Эти флаги могут быть переданы функции regex_search(), или функции regex_match(), или функциям-членам формата класса smatch.

Таблица 17.13. Флаги соответствия

Определено в regex_constants::match_flag_type
match_defaultЭквивалент format_default
match_not_bolHe рассматривать первый символ как начало строки
match_not_eolНе рассматривать последний символ как конец строки
match_not_bowНе рассматривать первый символ как начало слова
match_not_eowНе рассматривать последний символ как конец слова
match_anyЕсли соответствий несколько, может быть возвращено любое из них
match_not_nullНе соответствует пустой последовательности
match_continuousСоответствие должно начинаться с первого символа во вводе
match_prev_availУ исходной последовательности есть символы перед первым
format_defaultСтрока замены использует правила ECMAScript
format_sedСтрока замены использует правила POSIX sed
format_no_copyНе выводить несоответствующие части ввода
format_first_onlyЗаменить только первое вхождение

Флаги соответствия и формата имеют тип match_flag_type. Их значения определяются в пространстве имен regex_constants. Подобно пространству имен placeholders, используемому с функциями bind() (см. раздел 10.3.4), пространство имен regex_constants определено в пространстве имен std. Для использования имени из пространства regex_constants его следует квалифицировать именами обоих пространств имен:

using std::regex_constants::format_no_copy;

Это объявление указывает, что когда код использует флаг format_no_copy, необходим объект из пространства имен std::regex_constants. Вместо этого можно использовать и альтернативную форму using, рассматриваемую в разделе 18.2.2:

using namespace std::regex_constants;

Использование флагов формата

По умолчанию функция regex_replace() выводит всю исходную последовательность. Части, которые не соответствуют регулярному выражению, выводятся без изменений, а соответствующие части оформляются, как указано строкой формата. Это стандартное поведение можно изменить, указав флаг format_no_copy в вызове функции regex_replace():

// выдать только номера телефона: используется новая строка формата

string fmt2 = "$2.$5.$7 "; // поместить пробел как разделитель после

                           // последнего числа

// указать regex_replace() копировать только заменяемый текст

cout << regex_replace(s, r, fmt2, format_no_copy) << endl;

С учетом того же ввода эта версия программы создает такой вывод:

201.555.2368 862.555.0123

973.555.0130

609.555.0132 201.555.0175 800.555.0000

Упражнения раздела 17.3.4
Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных