我是perl的初学者,想匹配以A-Z和0-9开头的文件。它们还仅包含. _ -
个特殊字符。
这是我到目前为止的内容:
if (($file !~ /^[a-zA-Z0-9][\-\_\.a-zA-Z0-9]*/)) {
print ("error: invalid filename");
}
我测试了该程序,它可以找到文件名错误,例如-5,$ 5,#5, 但是它无法捕获错误名称为5#,5%,5 @等的文件名...
我根本找不到真正的问题。我在做什么错了?
答案 0 :(得分:2)
问题在于您的正则表达式锚定在开头(^
)而不是结尾处。任何以开头有效文件名的$file
。由于5#
以5
开头,因此一直通过。
修复:
if ($file !~ /^[a-zA-Z0-9][\-_.a-zA-Z0-9]*\z/) {
print "error: invalid filename\n";
}
\z
仅在字符串的末尾匹配,并将模式锚定在末尾。
_
不是正则表达式元字符,不需要进行转义。 .
不是[
]
组中的元字符。