Перейти к содержанию

Обработка текста: строки, потоки и регулярные выражения

Начало урока

Обработка текста: строки, потоки и регулярные выражения

Разрезаем, разбираем, собираем и проверяем текст средствами стандартной библиотеки C++

Главная идея: почти любая реальная программа поглощает текст и порождает текст: файлы настроек, строки CSV, записи логов, ввод пользователя, сетевые сообщения. C++ даёт для этой работы три взаимодополняющих инструмента. std::string хранит и правит символы. std::stringstream превращает текст в типизированные значения и обратно. std::regex описывает и сопоставляет шаблоны. Вместе они позволяют разбить строку, извлечь число и подтвердить, что адрес почты выглядит корректно, не прикасаясь ни к сырому char*, ни к рукописному циклу-разборщику.
К концу вы сможете:
  • искать, вырезать и пересобирать текст функциями-членами std::string,
  • разбирать поля, разделённые пробелами и разделителями, с помощью std::istringstream и собирать вывод через std::ostringstream,
  • писать шаблоны std::regex и выбирать между regex_match, regex_search и regex_replace,
  • вытаскивать захваченные группы из совпадения и безопасно проверять реальный ввод.

1. std::string: искать, вырезать, пересобирать

Со std::string вы познакомились в курсе для начинающих как с «контейнером символов». На этом уровне полезно знать его как настоящую последовательность с богатым индексным API из заголовка <string>. Три операции делают большую часть повседневной работы: find, substr и replace / append.

  • s.find("x") возвращает индекс первого вхождения или специальную константу std::string::npos, если его нет. Всегда сравнивайте с npos, а не с -1.
  • s.substr(pos, len) возвращает новую строку, скопированную с позиции pos; если len опущен, копирование идёт до конца.
  • s.replace(pos, len, repl), s.insert(pos, txt), s.erase(pos, len) и s += "..." правят строку на месте.
  • s.size() (то же, что length()), s.empty(), s[i] для доступа без проверки и s.at(i) для доступа с проверкой границ, который бросает std::out_of_range.
std::string path = "report.final.csv";
std::size_t dot = path.rfind('.');          // поиск СПРАВА
std::string ext = (dot == std::string::npos)
                  ? ""
                  : path.substr(dot + 1);   // "csv"

Обратите внимание на rfind: он находит последнюю точку, что как раз и нужно для расширения файла. Проверка на npos не факультативна: вызов substr с недопустимой позицией бросает исключение.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя