正则表达式传递一个字符序列,而另一个字符序列失败

时间:2016-02-04 21:41:37

标签: regex perl

我使用以下正则表达式:

$test="a\n";

if ($test =~ /^.$/ ){
 print "Test Passed\n";
}else{
 print "Test Failed\n";
}   

对于上述测试变量,正则表达式查找模式。

但是,如果我将变量更改为以下值,则无法识别模式。

$test="\na";

我知道我的表达式匹配单个字符,即目标应以单个字符开头和结尾。

2 个答案:

答案 0 :(得分:3)

简明回答

如果您需要检查字符串是否只有一个字符(任何字符,包括换行符),请使用

/^.\z/s

<强>解释

问题源于您使用$而不使用D修饰符这一事实,这意味着$在最后匹配,但不在字符串的最后。在此,$ = \Z

默认情况下,$将匹配字符串的结尾和最后一个换行符之前的位置。因此,a\n通过if ($test =~ /^.$/ )测试,但\na不会,因为.无法匹配换行符,并且它不在最后,而是在开始时(它)不会与if ($test =~ /^.$/ )if ($test =~ /^.$/s )匹配。

请注意,您可以使用\z锚点来强制正则表达式引擎在字符串的最后匹配。然后,即使使用DOTALL修饰符,两个测试用例都将失败。如果您需要这种行为,请使用/^.\z/。或/^.\z/s也匹配单个换行符。

另请参阅Whats the difference between \z and \Z in a regular expression and when and how do I use it?

答案 1 :(得分:1)

你有两个问题。

首先,$与字符串的结尾不匹配。在没有/m标志的情况下,它等同于\Z,它匹配字符串末尾的 或者在字符串末尾的换行符之前

这几乎不是你想要的,你应该使用只在字符串末尾匹配的\z。几乎所有使用

的代码

其次,默认情况下.与任何字符都不匹配。除非您提供/s标记,否则它会匹配任何字符\n

所以你的正则表达式/^.$/将匹配:

  1. 不是换行符的单个字符,或
  2. 两个字符,第一个不是换行符,第二个是
  3. 要匹配单个字符,请使用/^.\z/s(或只是长度($ string)== 1)。