我使用以下正则表达式:
$test="a\n";
if ($test =~ /^.$/ ){
print "Test Passed\n";
}else{
print "Test Failed\n";
}
对于上述测试变量,正则表达式查找模式。
但是,如果我将变量更改为以下值,则无法识别模式。
$test="\na";
我知道我的表达式匹配单个字符,即目标应以单个字符开头和结尾。
答案 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
。
所以你的正则表达式/^.$/
将匹配:
要匹配单个字符,请使用/^.\z/s
(或只是长度($ string)== 1)。