Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Функция 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
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов