在.NET System.Text.RegularExpressions.Regex 中,如果将^
和$
添加到Regex以查找完全匹配,则对于IsMatch,它仍会返回true终止\n
将附加到要验证的字符串。
例如,以下代码:
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的正则表达式?
答案 0 :(得分:1)
您应该使用.NET正则表达式中\z
的字符串锚点的结尾:
Regex regexExact = new Regex(@"^abc\z");
请参阅Anchors in Regular Expressions:
$
匹配必须发生在字符串或行的末尾,或者在字符串或行末尾的\n
之前。有关详细信息,请参阅End of String or Line\Z
匹配必须发生在字符串的末尾,或者在字符串末尾的\ n之前。有关详细信息,请参阅End of String or Before Ending Newline\z
匹配必须仅出现在字符串的末尾。有关详细信息,请参阅End of String Only。
可以在.net,java,pcre,delphi,ruby和php中使用相同的锚点。在python中,使用\Z
。在JavaScript RegExp
(ECMAScript)兼容模式中,$
锚点匹配字符串的最后一端(如果未定义/m
修饰符)。
请参阅regular-expressions.info上的Strings Ending with a Line Break:
因为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
。