Перевод строки в регулярных выражениях

Недавно, я встретил такой вопрос:

string test = "str1\nstr2";
Regex regex1 = new Regex("str1\nstr2");
Regex regex2 = new Regex("str1\\nstr2");
Regex regex3 = new Regex("str1\\\nstr2");
Console.WriteLine(regex1.IsMatch(test));
Console.WriteLine(regex2.IsMatch(test));
Console.WriteLine(regex3.IsMatch(test));

Почему все три регулярных выражения возвращают true?

Вопрос показался мне интересным, и я потратил время на его решение.

В первом случае у вас шаблон регулярного выражения содержит код последовательность символов «\n» (перевод строки) которая при компиляции превращается в символ перевода строки. То же самое происходит с тестируемой строкой. То есть шаблон регулярного выражения и тестируемая строка полностью совпадают.

Во втором случае шаблон содержит последовательность «\\n», которую компилятор превращает в строку из двух символов: обратный слэш и малая латинская n — «\n». Движок регулярных выражений .NET распознаёт этот шаблон и сопоставляет его символу «перевод строки» из тестируемой строки. В результате — шаблон совпадает.

В третьем случае шаблон содержит последовательность «\\\n», которую компилятор превращает в строку из двух символов: <обратный слэш> и <перевод строки>. Движок при разборе встречает <обратный слэш>, и проверяет следующий за ним символ. У движка есть правила для \s \S \w \W и т.д., но для <обратный слэш> <перевод-строки> правила нет, поэтому он игнорирует <обратный слэш> и продолжает работу как будто его не было. Забавный момент — получается чтобы сопоставить шаблон с обратным слэшом нам нужно в коде написать его 4 раза подряд — первое удвоение «съест» компилятор, второе — для движка регулярных выражений.

Совет: чтобы упростить себе работу с регулярными выражениями используйте verbatim string. Это строковый литерал, слева от открывающей кавычки которого стоит символ @. Для таких строк компилятор не производит преобразование escape-последовательностей с обратным слэшом.

Ссылки:

Оставьте комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.