Regex 如何匹配以字母数字字符开头且只有其中三个特殊字符的文件?
我是perl的初学者,希望匹配以a-Z和0-9开头的文件。它们也只包含Regex 如何匹配以字母数字字符开头且只有其中三个特殊字符的文件?,regex,perl,Regex,Perl,我是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@等 我根本找不到真正的问题。我做错了什么?问题是您的正则表达式锚定在开头(^),而不是结
\-代码>特殊字符。
这就是我到目前为止所做的:
if (($file !~ /^[a-zA-Z0-9][\-\_\.a-zA-Z0-9]*/)) {
print ("error: invalid filename");
}
我测试了这个程序,它可以发现文件名错误,比如-5,$5,#5,
但它无法捕获带有错误的文件名,如5#、5%、5@等
我根本找不到真正的问题。我做错了什么?问题是您的正则表达式锚定在开头(^
),而不是结尾。接受以有效文件名开头的任何$file
。由于5#
以5
开头,因此它将通过
修正:
\z
仅在字符串末尾匹配,将模式锚定在末尾
\
不是正则表达式元字符,不需要转义
不是[
]
组中的元字符。问题在于正则表达式锚定在开头(^
),而不是结尾。接受以有效文件名开头的任何$file
。由于5#
以5
开头,因此它将通过
修正:
\z
仅在字符串末尾匹配,将模式锚定在末尾
\
不是正则表达式元字符,不需要转义
不是[
]组中的元字符。您缺少使其成为完整字符串匹配的最后一个$
。如果没有它,您将允许在可选组[\-\\\\\\\.a-zA-Z0-9]
之后使用任何符号。您将丢失最后一个$
,以使其成为完整的字符串匹配。如果没有它,则允许在可选组[\-\\\\\\\.a-zA-Z0-9]
之后使用任何符号。
if ($file !~ /^[a-zA-Z0-9][\-_.a-zA-Z0-9]*\z/) {
print "error: invalid filename\n";
}