为什么$ .NET中的多行正则表达式与CRLF不匹配?

时间:2011-12-23 16:47:40

标签: c# .net regex line-breaks

我注意到以下内容:

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 regexp解析器的预期行为,还是我错过了一些隐藏的UseWindowsLinebreaks选项?

1 个答案:

答案 0 :(得分:50)

来自MSDN:

  

默认情况下,$仅匹配输入字符串的结尾。如果指定RegexOptions.Multiline选项,则它匹配换行符(\ n)或输入字符串的结尾。但是,它与回车符/换行符字符组合不匹配。要成功匹配它们,请使用子表达式\ r?$而不是$。

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

所以我不能说为什么(与其他语言的正则表达式的兼容性?),但至少它是预期的。