Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 如何检测perl字符串中的某些特殊字符?_Regex_Perl_Character - Fatal编程技术网

Regex 如何检测perl字符串中的某些特殊字符?

Regex 如何检测perl字符串中的某些特殊字符?,regex,perl,character,Regex,Perl,Character,我想检测Perl字符串中是否存在某些字符,如@$%\/。有人能推荐一个正则表达式吗。我试了几次,但都没用 =~ /(\W@\W#\W%\W*)/) =~ /(@|#|%|*)/) 我试过这些,但不起作用 有人能告诉我哪里出了问题吗?这应该可以: =~ /[@#$%\/]/ 如果字符串中包含一个字符,则会检测到该字符 my $s = "@"; if ($s =~ /[@#\$\%\/]/) { print "have it"; } 您的第二次尝试是正确的,但是您忘记了转义在

我想检测Perl字符串中是否存在某些字符,如@$%\/。有人能推荐一个正则表达式吗。我试了几次,但都没用

=~ /(\W@\W#\W%\W*)/)
=~ /(@|#|%|*)/) 
我试过这些,但不起作用

有人能告诉我哪里出了问题吗?

这应该可以:

=~ /[@#$%\/]/
如果字符串中包含一个字符,则会检测到该字符

my $s = "@";
if ($s =~ /[@#\$\%\/]/) {
        print "have it";
}

您的第二次尝试是正确的,但是您忘记了转义在正则表达式模式中具有特殊意义的字符

/\@|#|\$|%|\\|\//       # or m{\@|#|\$|%|\\|/}
但是,使用字符类会更有效

/[\@#\$%\\//]/          # or m{[\@#\$%\\/]}
如果您可以检查任何非单词字符,可以使用

/\W/
更安全的方法通常是指定要允许的字符,并排除所有其他字符。比如说,

/[^\w]/           # Only allow word characters.

你可以用。例如:

my $chars = '@#$%\/';
my ($regex) = map { qr /$_/ } join '|', map {quotemeta} split //, $chars;

=~m/\W/g;够了。我对您认为的\W会做什么感到困惑?它只检测到第一个字符。Try with it将不起作用$%被视为插值为“0”的变量,反斜杠将转义为正斜杠。试试/[\@\$%\\\/]/试试这个。它在我这一方不起作用,我的$s=lj2dm%;如果$s=~/[@$%\/]/{print have\n;}@dev_k2.0,则必须转义%符号。请看我编辑的答案否,%s不需要转义,尽管转义除了可读性之外没有什么坏处。我不是选民。
my $chars = '@#$%\/';
my ($regex) = map { qr /$_/ } join '|', map {quotemeta} split //, $chars;