我注意到以下内容:
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
选项?
答案 0 :(得分:50)
来自MSDN:
默认情况下,$仅匹配输入字符串的结尾。如果指定RegexOptions.Multiline选项,则它匹配换行符(\ n)或输入字符串的结尾。但是,它与回车符/换行符字符组合不匹配。要成功匹配它们,请使用子表达式\ r?$而不是$。
http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline
所以我不能说为什么(与其他语言的正则表达式的兼容性?),但至少它是预期的。