如果字符串仅包含 Perl 中的 ASCII 字母数字、破折号、下划线和点字符,则匹配

Match if string contains only ASCII alphanumeric, dash, underscore and dot characters in Perl

我有以下 Perl 脚本,如果字符串仅包含以下字符,则应该写入 OK a-z A-Z 破折号 - 下划线 _ 或点 . 和如果字符串包含任何其他字符,则失败。但是,无论我在字符串 $ref 中输入什么,它都显示 OK。

在此示例中,匹配应该失败,因为字符串包含 + \/

#!/usr/bin/perl

 print "Content-type: text/html\n\n";   

 $ref = 'abcABCZ01234+56789.htm_abc\/--a'; 

 if ($ref =~ m/[a-zA-Z_0-9\-\.]/) { print "OK\n\n"; }
 else { print "FAIL\n\n"; }

 print "<br>$ref\n\n"; 

1;

您的正则表达式在找到第一个满足正则表达式 class 的字符时匹配,但要确保所有字符都在正则表达式 class 中,您必须声明它从头开始匹配 ^ 到字符串末尾 \z,

$ref =~ m/^[a-zA-Z_0-9.-]+\z/;

您只需要添加锚点和量词:

if ($ref =~ /^[a-zA-Z_0-9.-]+$/) { print "OK\n\n"; }
#            ^              ^^