在 .NET System.Text.RegularExpressions.Regex中,如果^将 和$添加到正则表达式中以查找精确匹配,则如果将终止符\n附加到正在验证的字符串,则 IsMatch 仍返回 true。
例如,以下代码:
Regex regexExact = new Regex(@"^abc$");
Console.WriteLine(regexExact.IsMatch("abc"));
Console.WriteLine(regexExact.IsMatch("abcdefg"));
Console.WriteLine(regexExact.IsMatch("abc\n"));
Console.WriteLine(regexExact.IsMatch("abc\n\n"));
Run Code Online (Sandbox Code Playgroud)
返回:
true
false
true
false
Run Code Online (Sandbox Code Playgroud)
除了第一个之外,对于上述所有情况都会返回 false 的正则表达式是什么?
您应该使用 .NET 正则表达式中字符串锚点的最末尾\\z:
Regex regexExact = new Regex(@"^abc\\z");\nRun Code Online (Sandbox Code Playgroud)\n请参阅正则表达式中的锚点:
\n\n\n\n
$\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0匹配必须出现在字符串或行的末尾,或者在\\n字符串或行的末尾之前。有关详细信息,请参阅字符串或行结尾。
\n\\Z\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 匹配必须出现在字符串末尾,或者出现在字符串末尾的 \\n 之前。有关详细信息,请参阅字符串结尾或结束换行符之前。
\n\\z\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0匹配必须仅出现在字符串的末尾。有关详细信息,请参阅仅字符串结尾。
相同的锚点可以在.net、java、pcre、delphi、ruby 和php中使用。在python中,使用\\Z. 在 JavaScript RegExp(ECMAScript) 兼容模式中,$锚点匹配字符串的最末尾(如果未定义/m修饰符)。
请参阅正则表达式.info 中的以换行符结尾的字符串:
\n\n\n由于 Perl 在从文件中读取一行时返回一个末尾带有换行符的字符串,因此
\n$即使关闭多行模式,Perl 的正则表达式引擎也会在字符串末尾的换行符之前的位置进行匹配。Perl 还会匹配$字符串的最末尾,无论该字符是否是换行符。因此^\\d+$匹配123主题字符串是否为123或123\\n。大多数现代正则表达式风格都复制了这种行为。其中包括 .NET、Java、PCRE、Delphi、PHP 和 Python。此行为独立于任何设置,例如“多线模式”。
\n在除 Python 之外的所有这些风格中,
\n\\Z也在最后换行符之前匹配。如果您只想在字符串的绝对末尾进行匹配,请使用\\z(小写 z 而不是大写 Z)。\\A\\d+\\z不匹配123\\n。\\z匹配换行符之后的内容,与简写字符类不匹配。在 Python 中,
\n\\Z仅在字符串的最末尾匹配。Python 不支持\\z.