17.3.4. Использование функции regex_replace()
Регулярные выражения зачастую используются не только для поиска, но и для замены одной последовательности другой. Например, может потребоваться преобразовать американские номера телефонов в формат "ddd.ddd.dddd", где код города и три последующие цифры разделены точками.
Когда необходимо найти и заменить регулярное выражение в исходной последовательности, используется функция regex_replace()
. Подобно функции поиска, функция regex_replace()
, описанная в табл. 17.12, получает входную символьную последовательность и объект класса regex
. Следует также передать строку, которая описывает необходимый вывод.
Таблица 17.12. Функции замены регулярного выражения
m.format(dest, | Создает форматированный вывод, используя формат строки , соответствие в m и необязательные флаги match_flag_type в mft . Первая версия пишет в итератор вывода dest (см. раздел 10.5.1) и получает формат , который может быть строкой или парой указателей, обозначающих диапазон в символьном массиве. Вторая версия возвращает строку, которая содержит вывод и получает формат , являющийся строкой или указателем на символьный массив с нулевым символом в конце. По умолчанию mft имеет значение format_default |
regex_replace(dest, | Перебирает последовательность , используя функцию regex_search() для поиска соответствий объекту r класса regex . Использует формат строки и необязательные флаги match_flag_type в mft для формирования вывода. Первая версия пишет в итератор вывода dest и получает пару итераторов для обозначения последовательности . Вторая возвращает строку, содержащую вывод, a может быть строкой или указателем на символьный массив с нулевым символом в конце. Во всех случаях формат может быть строкой или указателем на символьный массив с нулевым символом в конце. По умолчанию mft имеет значение match_default |
Строку замены составляют подлежащие включению символы вместе с подвыражениями из соответствующей подстроки. В данном случае следует использовать второе, пятое и седьмое подвыражения из строки замены. Первое, третье, четвертое и шестое подвыражения игнорируются, поскольку они использовались в первоначальном форматировании номера, но не являются частью формата замены. Для ссылки на конкретное подвыражение используется символ $
, сопровождаемый индексом подвыражения:
string fmt = "$2.$5.$7"; //
Схему регулярного выражения и строку замены можно использовать следующим образом:
regex r(phone); //
string number = "(908) 555-1800";
cout << regex_replace(number, r, fmt) << endl;
Вывод этой программы будет таким:
908.555.1800
Куда интересней использование обработки регулярных выражений для замены номеров телефонов в большом файле. Предположим, например, что имеется файл имен и номеров телефонов, содержащий такие данные:
morgan (201) 555-2368 862-555-0123/
drew (973)555.0130
lee (609) 555-0132 2015550175 800.555-0000
Их следует преобразовать в такой формат:
morgan 201.555.2368 862.555.0123
drew 973.555.0130
lee 609.555.0132 201.555.0175 800.555.0000
Это преобразование можно осуществить следующим образом:
int main() {
string phone =