正则表达式匹配精确的字符串(不允许终止换行符)

Hut*_*tch 3 regex

在 .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 的正则表达式是什么?

Wik*_*żew 5

当前 .NET 正则表达式的解决方案

\n

您应该使用 .NET 正则表达式中字符串锚点的最末尾\\z

\n
Regex regexExact = new Regex(@"^abc\\z");\n
Run Code Online (Sandbox Code Playgroud)\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匹配必须仅出现在字符串的末尾。有关详细信息,请参阅仅字符串结尾

\n
\n

​​ 和中使用。在中,使用\\Z. 在 JavaScript RegExp(ECMAScript) 兼容模式中,$锚点匹配字符串的最末尾(如果未定义/m修饰符)。

\n

背景

\n

请参阅正则表达式.info 中的以换行符结尾的字符串

\n
\n

由于 Perl 在从文件中读取一行时返回一个末尾带有换行符的字符串,因此$即使关闭多行模式,Perl 的正则表达式引擎也会在字符串末尾的换行符之前的位置进行匹配。Perl 还会匹配$字符串的最末尾,无论该字符是否是换行符。因此^\\d+$匹配123主题字符串是否为123123\\n

\n

大多数现代正则表达式风格都复制了这种行为。其中包括 .NET、Java、PCRE、Delphi、PHP 和 Python。此行为独立于任何设置,例如“多线模式”。

\n

在除 Python 之外的所有这些风格中,\\Z也在最后换行符之前匹配。如果您只想在字符串的绝对末尾进行匹配,请使用\\z(小写 z 而不是大写 Z)。\\A\\d+\\z不匹配123\\n\\z匹配换行符之后的内容,与简写字符类不匹配。

\n

在 Python 中,\\Z仅在字符串的最末尾匹配。Python 不支持\\z.

\n
\n