正则表达式匹配完全字符串(不允许终止换行符)

时间:2018-02-16 17:28:23

标签: regex

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

1 个答案:

答案 0 :(得分:1)

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

您应该使用.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

可以在中使用相同的锚点。在中,使用\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+\z123\n不符。换行符后\z匹配,与速记字符类不匹配。

     

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