Многострочность в регулярках в C++
Регулярки при работе с многострочными строками имеют свои особенности. Разберем их на примере следующей строки, содержащей обычные символы, символы перевода строк и табуляции:
std::string txt = R"(111
222
333
444)";
Символы перевода строки можно поймать с
помощью команды '\n':
std::regex re(R"(\n)");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n";
В результате выведется следующая строка (промежутки между строками - это табуляция):
'111! 222! 333! 444'
Символы табуляции можно поймать с использованием
команды '\t':
std::regex re(R"(\t)");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n";
Результат выполнения кода:
'''
!111
!222
!333
!444
'''
Команда '.' для многострочной строки
не ловит символы перевода строки:
std::regex re(R"(.)");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n";
Результат выполнения кода:
'''
!!!
!!!!
!!!!
!!!!
'''
Чтобы поймать все символы в многострочной
строке, используется хитрый прием в виде
сочетания [\s\S]. Такая конструкция
найдет все обычные символы и все переводы
строк:
std::regex re(R"([\\s\\S])");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n";
Результат выполнения кода:
'!!!!!!!!!!!!!!!!!!'
Команда '$' в std::regex совпадает только с концом всей строки, а не с концом каждой строки внутри текста:
std::regex re(R"($)");
std::string res = std::regex_replace(txt, re, "!");
std::cout << res << "\n";
Результат выполнения кода:
'''
111!
222!
333!
444!
'''
Дана строка:
'''
abc
def
ghi
jkl
'''
Напишите регулярку, которая сделает из этой строки следующую:
'''
abc!
def!
ghi!
jkl!
'''
Дана строка:
'''
abc
def
ghi
jkl
'''
Напишите регулярку, которая сделает из этой строки следующую:
'''
! abc
! def
! ghi
! jkl
'''
Дана строка:
'''
abc
def
ghi
jkl
'''
Напишите регулярку, которая сделает из этой строки следующую:
'''!
abc
def
ghi
jkl
!'''
Дана строка:
'''
abc
def
ghi
jkl
'''
Напишите регулярку, которая сделает из этой строки следующую:
'''!
! abc
! def
! ghi
! jkl
!'''
Дана строка:
'''
abc
def
ghi
jkl
'''
Напишите регулярку, которая сделает из этой строки следующую:
'''!
abc!
def!
ghi!
jkl!
!'''
Дана строка:
'''
abc
def
ghi
jkl
'''
Напишите регулярку, которая сделает из этой строки следующую:
'''
!abc
!def
!ghi
!jkl
'''