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

Hei*_*nzi 37 .net c# regex line-breaks

我注意到以下几点:

var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline);   // true
var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false
Run Code Online (Sandbox Code Playgroud)

我糊涂了.RegexOptions的文档说:

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

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

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

Kev*_*sse 50

来自MSDN:

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

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

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

  • +1在多行模式的换行符之前,有一个_long_历史(因此是一个stromg先例)的`$`匹配.默认情况下使其表现不同将是MS的一个不好的举动.但是,他们可以添加一个.NET特定的修饰符来使`$`match:`(?= [\ r \n] |\z)`(这可能是你在这里寻找的表达式). (6认同)
  • 有趣的是,它在正则表达式实现中被广泛接受(和定义),$匹配_position_,**而不是**_literal_.因此,对于MSDN来说它与换行符相匹配也不完全正确. (4认同)
  • 令人惊讶,但至少定义明确.谢谢你挖掘它! (2认同)
  • 另一个令人费解的事情(与此一致)是.NET允许点匹配`\ r`,即使它设置为不匹配换行符. (2认同)