Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何匹配以字母数字字符开头且只有其中三个特殊字符的文件?_Regex_Perl - Fatal编程技术网

Regex 如何匹配以字母数字字符开头且只有其中三个特殊字符的文件?

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@等 我根本找不到真正的问题。我做错了什么?问题是您的正则表达式锚定在开头(^),而不是结

我是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@等


我根本找不到真正的问题。我做错了什么?

问题是您的正则表达式锚定在开头(
^
),而不是结尾。接受以有效文件名开头的任何
$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";
}