Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpRgLAB 41 of 696 menu
◀ ▶

Просмотр вперед и назад в 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"

Получите подстроки, перед которыми стоит символ доллара.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить