Поиск и замена
Преобразуйте текст с помощью regex
«Поиск и замена» — бесплатный урок C++ Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.
regex_replace
std::regex_replace возвращает новую строку, в которой каждое соответствие шаблону заменено строкой замены.
- Исходная строка остаётся неизменной.
- По умолчанию заменяются все соответствия.
#include <iostream>
#include <regex>
int main() {
std::regex p("cat");
std::string s = "the cat and the cat";
std::cout << std::regex_replace(s, p, "dog") << '\n';
return 0;
}Замена цифр
Шаблоны упрощают массовое редактирование, например замену каждой цифры в строке на заполнитель.
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d");
std::string s = "PIN 1234";
std::cout << std::regex_replace(s, p, "*") << '\n';
return 0;
}Обратные ссылки в замене
Используйте $1, $2 и последующие обозначения в строке замены, чтобы вставлять захваченные группы и переставлять части текста.
#include <iostream>
#include <regex>
int main() {
std::regex p("(\\w+) (\\w+)");
std::string s = "John Smith";
std::cout << std::regex_replace(s, p, "$2 $1") << '\n';
return 0;
}Полное соответствие: $&
Токен $& обозначает всё соответствие и удобен для обрамления найденного текста дополнительными символами.
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d+");
std::string s = "item 42";
std::cout << std::regex_replace(s, p, "[$&]") << '\n';
return 0;
}Замена только первого соответствия
Передайте std::regex_constants::format_first_only, чтобы заменить только первое соответствие, а не каждое вхождение.
#include <iostream>
#include <regex>
int main() {
std::regex p("o");
std::string s = "foo boo";
auto out = std::regex_replace(s, p, "0", std::regex_constants::format_first_only);
std::cout << out << '\n';
return 0;
}Нормализация пробельных символов
Распространённая задача очистки: заменить последовательности пробельных символов одним пробелом.
#include <iostream>
#include <regex>
int main() {
std::regex p("\\s+");
std::string s = "too many spaces";
std::cout << std::regex_replace(s, p, " ") << '\n';
return 0;
}Удаление соответствий
Замена на пустую строку фактически удаляет каждое соответствие, что удобно для удаления нежелательных символов.
#include <iostream>
#include <regex>
int main() {
std::regex p("[^a-zA-Z]");
std::string s = "a1b2c3";
std::cout << std::regex_replace(s, p, "") << '\n';
return 0;
}Изменение формата дат
Захватите части даты и переставьте их в строке замены, чтобы изменить формат.
#include <iostream>
#include <regex>
int main() {
std::regex p("(\\d{4})-(\\d{2})-(\\d{2})");
std::string s = "2026-05-30";
std::cout << std::regex_replace(s, p, "$3/$2/$1") << '\n';
return 0;
}Сохранение несопоставленного текста
По умолчанию несопоставленный текст копируется в результат. Используйте format_no_copy, чтобы вывести только замены и отбросить остальное.
#include <iostream>
#include <regex>
int main() {
std::regex p("\\d+");
std::string s = "a1b2c3";
auto out = std::regex_replace(s, p, "$&", std::regex_constants::format_no_copy);
std::cout << out << '\n';
return 0;
}Цензурирование слов
Объедините чередование с заменой, чтобы одновременно скрыть список слов.
#include <iostream>
#include <regex>
int main() {
std::regex p("bad|evil");
std::string s = "a bad and evil idea";
std::cout << std::regex_replace(s, p, "***") << '\n';
return 0;
}Построение результата
Поскольку regex_replace возвращает строку, можно выстраивать цепочку преобразований, передавая результат одного вызова в следующий.
#include <iostream>
#include <regex>
int main() {
std::string s = " Hello, World ";
s = std::regex_replace(s, std::regex("\\s+"), " ");
s = std::regex_replace(s, std::regex("^ | $"), "");
std::cout << "[" << s << "]\n";
return 0;
}Быстрая проверка
Проверьте своё понимание синтаксиса замены.
Итоги
Вы узнали, как преобразовывать текст с помощью regex_replace:
- по умолчанию заменяет все соответствия и возвращает новую строку
$1,$2и$&вставляют захваченные группы и всё соответствие- флаги, такие как
format_first_onlyиformat_no_copy - объединение вызовов в цепочку для создания сложной очистки
Далее Вы узнаете, как эффективно использовать регулярные выражения и избегать распространённых проблем с производительностью.
Часто задаваемые вопросы
Урок «Поиск и замена» бесплатный?
Да — полный текст урока «Поиск и замена» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.
Чему я научусь в уроке «Поиск и замена»?
Преобразуйте текст с помощью regex Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C++ Academy?
Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Поиск и замена»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C++ Academy?
Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы regex
- Группы захвата
- Поиск и замена
- Замечания о производительности