C# 为什么';.NET中的t$多行正则表达式是否匹配CRLF?

C# 为什么';.NET中的t$多行正则表达式是否匹配CRLF?,c#,.net,regex,line-breaks,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 我很困惑。文件说明: 多行: 多行模式。更改“^”和“$”的含义,使它们分别在任何行的开头和结尾匹配,而不仅仅是整个字符串的开头和结尾 由于

我注意到以下几点:

var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline);   // true
var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false
我很困惑。文件说明:

多行: 多行模式。更改“^”和“$”的含义,使它们分别在任何行的开头和结尾匹配,而不仅仅是整个字符串的开头和结尾

由于C#和VB.NET主要用于Windows世界,我猜.NET应用程序处理的大多数文件都使用CRLF换行符(
\r\n
)而不是LF换行符(
\n
)。尽管如此,.NET正则表达式解析器似乎仍无法将CRLF换行符识别为行尾

我知道我可以解决这个问题,例如,通过匹配
Line1\r?$
,但我仍然觉得奇怪。这真的是.NET regexp解析器的预期行为吗?还是我错过了一些隐藏的
UseWindowsLinebreaks
选项?

来自MSDN:

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


所以我说不出原因(是否兼容其他语言的正则表达式?),但至少它是有意的。

令人惊讶,但至少定义良好。谢谢你把它挖出来!有趣的是,在正则表达式实现中,$匹配一个位置,而不是一个文本,这一点被广泛接受(并定义)。因此,MSDN说它匹配换行符也不是完全正确的。+1在多行模式下换行符之前进行
$
匹配有很长的历史(因此有一个stromg先例)。让它在默认情况下表现出不同的行为对女士来说是一个糟糕的举动。然而,他们可能已经添加了一个.NET特定的修饰符来使
$
匹配:
(?=[\r\n]|\z)
(这可能是您在这里寻找的表达式)。另一个令人费解的事情(与此一致)是.NET允许点匹配
\r
,即使它被设置为不匹配换行符。这是相当恼人的行为,尤其是当微软(在这个时代)仍然继续使用一个毫无意义的额外字节作为换行符标记时。