C#System.RegEx在不应该匹配LF时匹配LF

C#System.RegEx在不应该匹配LF时匹配LF,c#,.net,regex,C#,.net,Regex,下面返回true Regex.IsMatch("FooBar\n", "^([A-Z]([a-z][A-Z]?)+)$"); 我也是 Regex.IsMatch("FooBar\n", "^[A-Z]([a-z][A-Z]?)+$"); 默认情况下,正则表达式处于单线模式,因此$不应匹配\n\n不是允许的字符 这是为了匹配单个ASCII PASCALCSEWORD(是的,它将匹配尾随Cap) 不适用于任何RegexOptions组合。多行| RegexOptions。单线 我做错了什么?来自

下面返回true

Regex.IsMatch("FooBar\n", "^([A-Z]([a-z][A-Z]?)+)$");
我也是

Regex.IsMatch("FooBar\n", "^[A-Z]([a-z][A-Z]?)+$");
默认情况下,正则表达式处于单线模式,因此$不应匹配\n\n不是允许的字符

这是为了匹配单个ASCII PASCALCSEWORD(是的,它将匹配尾随Cap)

不适用于任何RegexOptions组合。多行| RegexOptions。单线

我做错了什么?

来自维基百科:

$匹配字符串的结束位置或字符串结束换行符前的位置。在基于线的工具中,它匹配任何线的结束位置

因此,您要问的是,字符串的开头后面是否有大写字母,后跟任意次数(零或一个字母),后跟字符串的结尾,还是换行符之前的位置

这一切似乎都是真的

是的,不同的文档源之间似乎存在一些不匹配,关于什么是新行,以及$如何工作或应该如何工作。它总是让人想起智慧:

有时一个人遇到问题,他会用正则表达式来解决。
现在这个人有两个问题


在.NET正则表达式中,
$
锚(如在PCRE、Python、PCRE、Perl中,但不是JavaScript中)与行尾或字符串中最后一个换行符(
“\n”
)之前的位置相匹配

见:

$
匹配必须出现在字符串或行的末尾,或者在字符串或行的末尾出现在
\n
之前。有关详细信息,请参阅

没有任何修饰符可以在.NET正则表达式中重新定义此值(在PCRE中,您可以仅内部使用
D
PCRE\u-DOLLAR\u
修饰符)

您必须查找
\z
锚定:它仅在字符串的最末端匹配:

\z
匹配只能出现在字符串的末尾。有关详细信息,请参阅

A:


在Windows上,新行是\r\n,不是\n。是,但.NET的正则表达式实现与之匹配。出于某种奇怪的原因,请查看文档。是的,您是对的,它将\n视为换行符,因此正则表达式只检查“FooBar”,这就是它匹配的原因。不确定它为什么将\n作为新行处理,可能是为了增加与其他操作系统的兼容性…不应该这样。正则表达式​选项。​多行字段命名空间:System.Text.RegularExpressions程序集:System.Text.RegularExpressions.dll、System.dll、netstandard.dll多行模式。更改“^”和“$”的含义,使它们分别在任何行的开头和结尾匹配,而不仅仅是整个字符串的开头和结尾。有关详细信息,请参阅正则表达式选项主题中的“多行模式”部分。不,不应该,在WIndows上,新行必须是\r\n,而不是\n,因此该行的最后一个字符是\n@Gusman
Regex.IsMatch(“FooBar\n\n”,“^[A-Z]([A-Z][A-Z]?)+$”,RegexOptions.Singleline)
(两个换行符)返回false。使用MultiLine时,它返回true。我认为他是对的。IIRC将普通的
'\n'
视为与UNIX兼容的新行,是MS land中的一个古老惯例。在C语言中,您将
\n
写入以文本模式打开的
文件*
,它实际上将
\r\n
写入该文件。它在文件中是
\r\n
,但在缓冲区中可能是
\n
@EdPlunkett是的,他是对的,但不应该是对的,这就是我的意思XD。问题是“新行”的定义,在windows上,“新行”是CR+LF,但正则表达式将LF视为与on一样的“新行”*nix@Gusman : _read返回读取的字节数,如果文件中剩余的字节数小于count,或者如果文件是在文本模式下打开的,则该字节数可能小于count,在这种情况下,每个回车-换行符(CR-LF)对将替换为单个换行符。“缓冲IO函数也是如此。@EdPlunkett:请参阅。这不容易找到,但行为是有记录的。请投票给这个答案。当我发布我的答案时,我没有看到这一点。再次感谢威克托
Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[A-Z]([a-z][A-Z]?)+$"));  // => True
Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[A-Z]([a-z][A-Z]?)+\z")); // => False