Подтвердить что ты не робот

Почему не $в многострочных регулярных выражениях .NET не соответствует CRLF?

Я заметил следующее:

var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline);   // true
var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false

Я в замешательстве. В документации RegexOptions говорится:

Multiline: Многострочный режим. Изменяет значение ^ и $, чтобы они соответствовали в начале и конце любой строки, а не только началу и концу всей строки.

Так как С# и VB.NET в основном используются в мире Windows, я бы предположил, что большинство файлов, обработанных приложениями .NET, используют CRLF linebreaks (\r\n), а не LF linebreaks (\n). Тем не менее, похоже, что синтаксический анализатор регулярных выражений .NET не распознает линию строк CRLF как конец строки.

Я знаю, что я мог бы обойти это, например, путем сопоставления Line1\r?$, но это все еще кажется мне странным. Это действительно предполагаемое поведение анализатора .NET regexp или мне не хватает скрытой опции UseWindowsLinebreaks?

4b9b3361

Ответ 1

Из MSDN:

По умолчанию $соответствует только концу входной строки. Если вы укажете опцию RegexOptions.Multiline, она будет соответствовать либо символу новой строки (\n), либо концу строки ввода. Однако это не соответствует комбинации символов возврата каретки/линии. Чтобы успешно их сопоставить, используйте подвыражение \r? $Вместо $.

http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline

Так что я не могу сказать, почему (совместимость с регулярными выражениями на других языках?), но по крайней мере он предназначен.