"(\\()?(\\d{3})(\\))?([-. ])?(\\d{3})([-. ])?(\\d{4})";
regex r(phone); //
smatch m;
string s;
string fmt = "$2.$5.$7"; //
//
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_bol | He рассматривать первый символ как начало строки |
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 "; //
//
//
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