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

3
在.NET中,使用System.Text.RegularExpressions.Regex进行正则匹配时,如果在正则表达式中添加^$用于寻找精确匹配,但是如果被验证的字符串末尾加上终止符号\n,则函数仍会返回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"));

返回:

true
false
true
false

什么正则表达式可以使除第一个以外的所有内容返回false?

1
为什么你需要正则表达式呢?只需查看字符串是否完全是"abc"就可以了吗? - maccettura
1
可能真正的模式不是一个常数。 - Blake Thingstad
@maccettura,我提供了一个简单的示例来演示问题。 - Hutch
1个回答

5

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

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

Regex regexExact = new Regex(@"^abc\z");

请参见正则表达式中的锚点:

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

同一个锚点可以在中使用。在中,使用\Z。在JavaScript RegExp(ECMAScript)兼容的模式中,$锚点匹配字符串的结尾(如果没有定义/m修饰符)。

背景

请参考正则表达式网站上的以换行符结束的字符串

由于Perl从文件中读取一行时返回带有换行符的字符串,因此即使关闭多行模式,Perl的正则表达式引擎也会在字符串末尾的换行符之前的位置匹配$。Perl还会在字符串的最后一个字符处匹配$,无论该字符是否为换行符。因此,^\d+$会匹配123,无论主题字符串是123还是123\n
大多数现代正则表达式都复制了这种行为,包括.NET、Java、PCRE、Delphi、PHP和Python。这种行为独立于任何设置,例如“多行模式”。
除Python外,在所有这些正则表达式中,\Z也会在最后一行之前匹配。如果您只想在字符串的绝对末尾进行匹配,请使用\z(小写z而不是大写Z)。\A\d+\z不会匹配123\n\z会在换行符之后匹配,这不会被速记字符类匹配。
在Python中,\Z仅在字符串的最后一位匹配。Python不支持\z

1
很好,提到Python的区别。 - bobble bubble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接