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
来自维基百科:
$匹配字符串的结束位置或字符串结尾换行符之前的位置。 在基于行的工具中,它匹配任何行的结束位置。
因此,您询问在字符串开头之后是否有大写字母,后跟任意次数(零或一个字母),后跟字符串的结尾,或者换行符之前的位置。
这一切似乎都是真的。
是的,不同的文档来源之间似乎存在一些不匹配的问题,即什么被视为换行符以及$如何工作或应该正常工作。 它总是让人想起智慧:
有时一个人有问题,他认为他会使用正则表达式来解决它。
现在这个男人有两个问题。