繁体   English   中英

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

[英]Why doesn't $ in .NET multiline regular expressions match CRLF?

我注意到以下几点:

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选项?

来自 MSDN:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM