Обработка текста: строки, потоки и регулярные выражения
Разрезаем, разбираем, собираем и проверяем текст средствами стандартной библиотеки 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 с недопустимой позицией бросает исключение.