Функция regex_replace(): замена в строке

Функция regex_replace() ищет в строке str совпадения с шаблоном re, заменяет их в соответствии со строкой format и возвращает новую строку. Прототипы функции:

template<typename _Rx_traits, typename _Ch_type>
   basic_string<_Ch_type>
   regex_replace(const _Ch_type *str,
                 const basic_regex<_Ch_type, _Rx_traits> &re,
                 const _Ch_type *format,
                 match_flag_type flags=match_default);
template<typename _Rx_traits, typename _Ch_type,
         typename _St, typename _Sa>
   basic_string<_Ch_type>
   regex_replace(const _Ch_type *str,
                 const basic_regex<_Ch_type, _Rx_traits> &re,
                 const basic_string<_Ch_type, _St, _Sa> &format,
                 match_flag_type flags=match_default);
template<typename _Rx_traits, typename _Ch_type,
         typename _St, typename _Sa>
   basic_string<_Ch_type, _St, _Sa>
   regex_replace(const basic_string<_Ch_type, _St, _Sa> &str,
                 const basic_regex<_Ch_type, _Rx_traits> &re,
                 const _Ch_type *format,
                 match_flag_type flags=match_default);
template<typename _Rx_traits, typename _Ch_type,
         typename _St, typename _Sa, typename _Fst, typename _Fsa>
   basic_string<_Ch_type, _St, _Sa>
   regex_replace(const basic_string<_Ch_type, _St, _Sa> &str,
                 const basic_regex<_Ch_type, _Rx_traits> &re,
                 const basic_string<_Ch_type, _Fst, _Fsa> &format,
                 match_flag_type flags=match_default);
template<typename _Out_iter, typename _Bi_iter,
         typename _Rx_traits, typename _Ch_type>
   _Out_iter regex_replace(_Out_iter out,
                           _Bi_iter first, _Bi_iter last,
                           const basic_regex<_Ch_type, _Rx_traits> &re,
                           const _Ch_type *format,
                           match_flag_type flags=match_default);
template<typename _Out_iter, typename _Bi_iter,
         typename _Rx_traits, typename _Ch_type,
         typename _St, typename _Sa>
   _Out_iter regex_replace(_Out_iter out,
                        _Bi_iter first, _Bi_iter last,
                        const basic_regex<_Ch_type, _Rx_traits> &re,
                        const basic_string<_Ch_type, _St, _Sa> &format,
                        match_flag_type flags=match_default);

Пример замены всех чисел в строке на символ +:

std::regex rgx("[0-9]+");
std::string str("10 20 30");
std::string format("+");
std::string result = std::regex_replace(str, rgx, format);
std::cout << result << std::endl; // + + +

В параметре flags можно указать те же флаги, что и в функциях regex_match() и regex_search() (см. разд. 10.3), а также следующие дополнительные флаги:

std::regex_constants::format_default
std::regex_constants::format_sed
std::regex_constants::format_first_only
std::regex_constants::format_no_copy

Если в параметре flags указан флаг format_first_only, то будет заменено только первое совпадение с шаблоном:

std::regex rgx("[0-9]+");
std::string str("10 20 30");
std::regex_constants::match_flag_type flags =
           std::regex_constants::format_first_only;
std::string result = std::regex_replace(str, rgx, "+", flags);
std::cout << result << std::endl; // + 20 30

Внутри строки format можно использовать следующие специальные комбинации символов:

  • $& — фрагмент полностью совпадающий с шаблоном;
  • $n — фрагмент внутри группы с индексом n (нумерация групп внутри шаблона начинается с 1);
  • $` — часть строки перед фрагментом, соответствующим шаблону;
  • $' — часть строки после фрагмента, соответствующего шаблону;
  • $$ — символ $.

В качестве примера поменяем два тега местами:

std::regex rgx("<([a-z]+)><([a-z]+)>");
std::string str("<br><hr>");
std::string format("<$2><$1>");
std::string result = std::regex_replace(str, rgx, format);
std::cout << result << std::endl; // <hr><br>

Так как символ $ является специальным, его необходимо удваивать:

std::regex rgx("[0-9]+");
std::string result = std::regex_replace("10 20 30", rgx, "$$");
std::cout << result << std::endl; // $ $ $

Если в параметре flags указан флаг format_no_copy, то фрагменты не соответствующие шаблону в итоговую строку вставлены не будут:

std::regex::flag_type flags =
            std::regex::icase | std::regex::ECMAScript;
std::regex rgx(
     "([a-z0-9_.-]+)@((?:[a-z0-9-]+\\.)+[a-z]{2,6})", flags);
std::string str("text1 <user3@mail.ru> text2");
std::string format("prefix: \'$`\', E-mail: $&\nuser: $1, "
                   "site: $2, suffix: \'$'\'");
std::regex_constants::match_flag_type flags2 =
           std::regex_constants::format_no_copy;
std::string result = std::regex_replace(str, rgx, format, flags2);
std::cout << result << std::endl;

Результат при наличии флага format_no_copy:

prefix: 'text1 <', E-mail: user3@mail.ru
user: user3, site: mail.ru, suffix: '> text2'

Результат при отсутствии флага format_no_copy:

text1 <prefix: 'text1 <', E-mail: user3@mail.ru
user: user3, site: mail.ru, suffix: '> text2'> text2

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов