Флаги в строке шаблона в C++
В std::regex встроенные флаги (?i)
в тексте шаблона не поддерживаются. Режим
без учета регистра задают вторым аргументом
конструктора: std::regex::icase. Отдельного
многострочного флага нет: ^ и $
привязаны к началу и концу всей строки.
Чтобы точка захватывала перевод строки,
используют [\s\S].
Без флага шаблон [a-z]+ найдет только строчные буквы:
std::string txt = "aaa bbb CCC DDD";
std::regex re(R"([a-z]+)");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n";
С флагом std::regex::icase буквы любого
регистра попадут под шаблон:
std::string txt = "aaa AAA bbb BBB";
std::regex re(R"([a-z]+)", std::regex::icase);
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n";
Точка без специальной конструкции не совпадает
с переводом строки. С [\s\S] заменяются
все символы:
std::string txt = "aaa\nbbb";
std::regex dot(R"(.)");
std::string without = std::regex_replace(txt, dot, "!");
std::regex any(R"([\s\S])");
std::string withFlag = std::regex_replace(txt, any, "!");
std::cout << without << "\n";
std::cout << withFlag << "\n";
Дана строка:
std::string txt = "Code CODE code";
Замените каждое слово "code" на
"*" без учета регистра и выведите
строку в консоль.