Многострочность в регулярках C#
Регулярки при работе с многострочными строками имеют свои особенности. Разберём их на примере текста с обычными символами и переводами строк:
string txt = """
111
222
333
444
""";
Console.WriteLine(txt);
Символы перевода строки можно заменить
шаблоном "'\n'" (в verbatim-строке
записывают как @"\n"):
using System.Text.RegularExpressions;
string txt = """
111
222
333
444
""";
string res = Regex.Replace(txt, @"\n", "! ");
Console.WriteLine(res);
Табуляцию ловят шаблоном "'\t'".
Возьмём строку, где числа разделены
табами:
using System.Text.RegularExpressions;
string txt = "111\t222\t333\t444";
string res = Regex.Replace(txt, @"\t", "!");
Console.WriteLine(res);
Команда "'.'" для многострочной строки
не захватывает символ перевода строки:
using System.Text.RegularExpressions;
string txt = """
aaa
bbbb
ccc
""";
string res = Regex.Replace(txt, @".", "!");
Console.WriteLine(res);
Чтобы учесть и пробельные символы, и переводы
строк, используют класс [\s\S]:
using System.Text.RegularExpressions;
string txt = """
aaa
bbbb
""";
string res = Regex.Replace(txt, @"[\s\S]", "!");
Console.WriteLine(res);
Якорь "'$'" без RegexOptions.Multiline
совпадает только с концом всей строки:
using System.Text.RegularExpressions;
string txt = """
111
222
333
444
""";
string res = Regex.Replace(txt, @"$", "!");
Console.WriteLine(res);
С флагом Multiline символ "'$'"
работает в конце каждой строки:
using System.Text.RegularExpressions;
string txt = """
111
222
333
444
""";
string res = Regex.Replace(txt, @"$", "!", RegexOptions.Multiline);
Console.WriteLine(res);
Дан четырёхстрочный список городов:
string txt = """
rome
oslo
lima
kyoto
""";
Напишите регулярку, которая поставит восклицательный знак в конце каждой строки списка, и выведите результат.
Дан текст из четырёх коротких строк:
string txt = """
alpha
beta
gamma
delta
""";
Добавьте символ "'!'" и табуляцию
перед каждой строкой и выведите результат.
Дан блок из четырёх коротких строк:
string txt = """
one
two
three
four
""";
Обрамите весь блок восклицательными
знаками: отдельный "'!'" перед
первой и после последней строки,
остальные строки не меняйте. Выведите
итог.
Дан журнал из четырёх строк с метками уровня:
string txt = """
info: start
warn: disk
info: done
err: timeout
""";
Замените только переводы строк на
"'; '", чтобы получить одну
строку журнала, и выведите её.