Почему многострочные регулярные выражения $ in .NET не соответствуют CRLF? - PullRequest
37 голосов
/ 23 декабря 2011

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

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

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

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

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

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

1 Ответ

50 голосов
/ 23 декабря 2011

Из MSDN:

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

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

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

...