我注意到以下几点:
var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline); // true
var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false
我很困惑。的文档正则表达式选项 http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regexoptions.aspx says:
多线:
多行模式。更改 ^ 和 $ 的含义,以便它们分别在任何行的开头和结尾处匹配,而不仅仅是整个字符串的开头和结尾。
由于 C# 和 VB.NET 主要用于 Windows 世界,我猜测 .NET 应用程序处理的大多数文件都使用 CRLF 换行符(\r\n
) 而不是 LF 换行符 (\n
)。尽管如此,.NET 正则表达式解析器似乎无法将 CRLF 换行符识别为行结束.
我知道我可以解决这个问题,例如,通过匹配Line1\r?$
,但我仍然觉得很奇怪。这真的是 .NET 正则表达式解析器的预期行为吗?还是我错过了一些隐藏的行为?UseWindowsLinebreaks
option?
来自 MSDN:
默认情况下,$ 仅匹配输入字符串的末尾。如果指定 RegexOptions.Multiline 选项,它将匹配换行符 (\n) 或输入字符串的末尾。但是,它与回车/换行字符组合不匹配。要成功匹配它们,请使用子表达式 \r?$ 而不仅仅是 $。
http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Multiline
所以我不能说为什么(与其他语言的正则表达式兼容?),但至少它是有意的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)