问题描述
在 .NET System.Text.RegularExpressions.Regex 中,如果将 ^
和 $
添加到 Regex 以查找精确匹配,则如果终止 \n
附加到要验证的字符串,则 IsMatch 仍然返回 true.
In .NET System.Text.RegularExpressions.Regex if ^
and $
are added to the Regex to look for exact matches, it still returns true for IsMatch if a terminating \n
is appended to the string being verified.
例如以下代码:
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 的正则表达式是什么?
What is the Regex that will return false for all of the above except the first?
推荐答案
当前 .NET 正则表达式的解决方案
您应该使用 .NET 正则表达式中的字符串锚点的结尾,即 \z
:
Regex regexExact = new Regex(@"^abc\z");
参见 正则表达式中的锚:
$
匹配必须出现在字符串或行的末尾,或者出现在字符串或行末尾的 \n
之前.有关详细信息,请参阅 End字符串或行.\Z
匹配必须出现在字符串的末尾,或出现在字符串末尾的 \n 之前.有关详细信息,请参阅结束字符串或结束换行符之前.\z
匹配只能出现在字符串的末尾.有关详细信息,请参阅结束仅字符串.
同样的锚点可以在.net, java, pcre, delphi, ruby 和 php.在 python 中,使用 \Z代码>.在 JavaScript
RegExp
(ECMAScript) 兼容模式中,$
锚匹配字符串的最末端(如果没有 /m
修饰符已定义).
The same anchor can be used in .net, java, pcre, delphi, ruby and php. In python, use \Z
. In JavaScript RegExp
(ECMAScript) compatible patterns, the $
anchor matches the very end of string (if no /m
modifier is defined).
请参阅正则表达式.info上的以换行符结尾的字符串:
see Strings Ending with a Line Break at regular-expressions.info:
因为从文件中读取一行时,Perl 会返回一个末尾有换行符的字符串,所以 Perl 的正则表达式引擎会在字符串末尾的换行符之前的位置匹配 $
,即使是 multi 时-line 模式已关闭.Perl 还会匹配字符串末尾的 $
,无论该字符是否为换行符.所以 ^\d+$
匹配 123
主题字符串是 123
还是 123\n
.
大多数现代正则表达式风格都复制了这种行为.这包括 .NET、Java、PCRE、Delphi、PHP 和 Python.此行为独立于任何设置,例如多行模式".
Most modern regex flavors have copied this behavior. That includes .NET, Java, PCRE, Delp PHP, and Python. This behavior is independent of any settings such as "multi-line mode".
在除 Python 之外的所有这些风格中,\Z
也在最后一个换行符之前匹配.如果您只想匹配字符串的绝对末尾,请使用 \z
(小写 z 而不是大写 Z).\A\d+\z
与 123\n
不匹配.\z
匹配换行符后,不匹配简写字符类.
In all these flavors except Python, \Z
also matches before the final line break. If you only want a match at the absolute very end of the string, use \z
(lower case z instead of upper case Z). \A\d+\z
does not match 123\n
. \z
matches after the line break, which is not matched by the shorthand character class.
在 Python 中,\Z
仅匹配字符串的最末尾.Python 不支持 \z
.
In Python, \Z
matches only at the very end of the string. Python does not support \z
.
这篇关于正则表达式匹配精确的字符串(不允许终止换行符)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!