Почему не $в многострочных регулярных выражениях .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
?
Ответы
Ответ 1
Из MSDN:
По умолчанию $соответствует только концу входной строки. Если вы укажете опцию RegexOptions.Multiline, она будет соответствовать либо символу новой строки (\n), либо концу строки ввода. Однако это не соответствует комбинации символов возврата каретки/линии. Чтобы успешно их сопоставить, используйте подвыражение \r? $Вместо $.
http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline
Так что я не могу сказать, почему (совместимость с регулярными выражениями на других языках?), но по крайней мере он предназначен.