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

以下返回true

Regex.IsMatch("FooBar\n", "^([AZ]([az][AZ]?)+)$"); 

那也是

 Regex.IsMatch("FooBar\n", "^[AZ]([az][AZ]?)+$"); 

RegEx默认处于SingleLine模式,因此$不应与\ n匹配。 \ n不是允许的字符。

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

不适用于RegexOptions.Multiline |的任何组合 RegexOptions.Singleline

我究竟做错了什么?

在.NET正则表达式中, $ anchor(如PCRE,Python,PCRE,Perl,但不是 JavaScript)匹配行尾或字符串中最后一行( "\n" )字符前的位置

请参阅此文档 :

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

没有修饰符可以在.NET正则表达式中重新定义它(在PCRE中,您可以使用D PCRE_DOLLAR_ENDONLY修饰符)。

你必须要找到\z anchor:它只匹配字符串的最后一部分

\z匹配必须仅出现在字符串的末尾。 有关更多信息,请参见仅字符串结尾 。

C#中的一个简短测试 :

 Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[AZ]([az][AZ]?)+$")); // => True Console.WriteLine(Regex.IsMatch("FooBar\n", @"^[AZ]([az][AZ]?)+\z")); // => False 

来自维基百科:

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

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

这一切似乎都是真的。

是的,不同的文档来源之间似乎存在一些不匹配的问题,即什么被视为换行符以及$如何工作或应该正常工作。 它总是让人想起智慧:

有时一个人有问题,他认为他会使用正则表达式来解决它。
现在这个男人有两个问题。