为什么.NET中的多行正则expression式不匹配CRLF?
我注意到了以下几点:
var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline); // true var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false
我很困惑。 RegexOptions的文档说:
多线 :多线模式。 改变^和$的含义,使它们分别匹配任何行的开始和结束,而不仅仅是整个string的开始和结束。
由于C#和VB.NET主要用于Windows世界,所以我猜想.NET应用程序处理的大多数文件使用CRLF换行符( \r\n
)而不是LF换行符( \n
)。 尽pipe如此,.NET正则expression式parsing器似乎无法将CRLF 换行识别为行尾 。
我知道我可以解决这个问题,例如,通过匹配Line1\r?$
,但它仍然令我感到奇怪。 这是真正的.NET正则expression式parsing器的预期行为还是我错过了一些隐藏的UseWindowsLinebreaks
选项?
来自MSDN:
默认情况下,$只匹配inputstring的末尾。 如果指定了RegexOptions.Multiline选项,它将匹配换行符(\ n)或inputstring的结尾。 但是,它不匹配回车符/换行符组合。 要成功匹配它们,请使用子expression式\ r?$而不是$。
http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline
所以我不能说为什么(与其他语言的正则expression式兼容?),但至less是它的意图。