Просмотр вперед и назад в C++
Иногда нужно решить задачу такого типа:
найти строку 'aaa' и заменить ее
на '!', но только если после
'aaa' стоит 'x', а сам
'x' при этом не заменять. Если мы
попытаемся решить задачу 'в лоб',
то у нас ничего не выйдет:
std::string txt = "aaax baaa"
std::regex re(R"(aaax)");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n" // выведет '! baaa', а хотели '!x baaa'
Для решения задачи нужен способ сказать,
что 'x' не следует заменять. Делается
это .
Эти скобки называются позитивный просмотр
вперед. Позитивный - так как 'x'
(в нашем случае) должен быть - только тогда
произойдет замена.
Применим эти скобки для решения нашей задачи:
std::string txt = "aaax baaa"
std::regex re(R"rx(aaa(?=x))");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n" // выведет '!x aaab
Есть и негативный просмотр вперед
- (?! ) - он, наоборот, говорит,
что чего-то должно не быть. В следующем
примере, замена произойдет, только если
после 'aaa' стоит НЕ 'x':
std::string txt = "aaax aaab"
std::regex re(R"rx(aaa(?!x))");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n" // выведет 'aaax !b'
Аналогичным образом есть позитивный
просмотр назад - (?<= ). В
следующем примере замена произойдет, только
если перед 'aaa' стоит 'x':
std::string txt = "xaaa"
std::regex re(R"rx((?<=x)aaa)rx");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n" // выведет 'x!'
И есть также негативный просмотр назад
- (?<! ). В следующем примере
замена произойдет, только если перед
'aaa' не стоит 'x':
std::string txt = "baaa"
std::regex re(R"rx((?<!x)aaa)rx");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n" // выведет 'b!'
Дана строка, содержащая имена функций:
std::string txt = "func1() func2() func3()"
Получите массив имен функций из строки.
Дана строка с тегом:
std::string txt = "<a href=\"\" class=\"eee\" id=\"zzz\">"
Получите массив имен атрибутов этого тега.
Дана строка с переменными:
std::string txt = "$aaa $bbb $ccc xxxx"
Получите подстроки, перед которыми стоит символ доллара.