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

Regex 正则表达式为一个字符序列传递,而为另一个字符序列传递失败,regex,perl,Regex,Perl,我正在使用以下正则表达式: $test="a\n"; if ($test =~ /^.$/ ){ print "Test Passed\n"; }else{ print "Test Failed\n"; } 对于前面提到的测试变量,正则表达式将查找模式 $test="\na"; 但是,如果我将变量更改为以下值,它将无法识别模式 $test="\na"; 我知道我的表达式与单个字符匹配,即目标应该以单个字符开头和结尾。简明答案 如果需要检查字符串是否只有一个字符(包括换行符),请

我正在使用以下正则表达式:

$test="a\n";

if ($test =~ /^.$/ ){
 print "Test Passed\n";
}else{
 print "Test Failed\n";
}   
对于前面提到的测试变量,正则表达式将查找模式

$test="\na";
但是,如果我将变量更改为以下值,它将无法识别模式

$test="\na";
我知道我的表达式与单个字符匹配,即目标应该以单个字符开头和结尾。

简明答案

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

/^.\z/s
解释

问题源于这样一个事实,即使用$without D修饰符,这意味着$matches在字符串的末尾,而不是最末尾。这里,$=\Z

默认情况下,$将匹配字符串的结尾和最后一个换行之前的位置。因此,a\n通过if$test=~/^.$/test,但\n不会通过,因为。无法匹配换行符,且该换行符不在末尾,但在开头,它不会与if$test=~/^.$/匹配,也不会与if$test=~/^.$/s匹配

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

另外,请参见简明答案

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

/^.\z/s
解释

问题源于这样一个事实,即使用$without D修饰符,这意味着$matches在字符串的末尾,而不是最末尾。这里,$=\Z

默认情况下,$将匹配字符串的结尾和最后一个换行之前的位置。因此,a\n通过if$test=~/^.$/test,但\n不会通过,因为。无法匹配换行符,且该换行符不在末尾,但在开头,它不会与if$test=~/^.$/匹配,也不会与if$test=~/^.$/s匹配

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

另外,请参见您有两个问题

First$与字符串的结尾不匹配。如果没有/m标志,它相当于\Z,它在字符串末尾或字符串末尾的换行符之前匹配

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

其次。默认情况下,不匹配任何字符。除非提供/s标志,否则它将匹配除\n以外的任何字符

因此,您的regex/^.$/将匹配:

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

您有两个问题

First$与字符串的结尾不匹配。如果没有/m标志,它相当于\Z,它在字符串末尾或字符串末尾的换行符之前匹配

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

其次。默认情况下,不匹配任何字符。除非提供/s标志,否则它将匹配除\n以外的任何字符

因此,您的regex/^.$/将匹配:

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

我不明白第一个测试用例通过的原因,因为输入中有两个字符,即新行和字符a。我已经解释过了。$is\Z,在字符串末尾或最后一个换行符之前匹配。您的字符串a\n有1个非空白字符,并且与。。然后,$与最后一个换行符前面的位置匹配。答对 了我不明白为什么第一个测试用例通过了,因为输入中有两个字符,即一个新行和一个字符a。我已经解释过了。$is\Z,在字符串末尾或最后一个换行符之前匹配。您的字符串a\n有1个非空白字符,并且与。。然后,$与最后一个换行符前面的位置匹配。答对 了