0Pricing
C++ Academy · Урок

Поиск и замена

Преобразуйте текст с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. Основы regex
  2. Группы захвата
  3. Поиск и замена
  4. Замечания о производительности
← Назад к C++ Academy