如何编写一个只与这些字符匹配的字符串的Perl正则表达式?

时间:2010-02-17 20:17:00

标签: regex perl

我对正则表达式很新。我想写一个正则表达式来验证给定的字符串是否只有某些字符。如果字符串中包含除此之外的任何其他字符,则不应匹配。

我想要的角色是:

 & ' : , / - ( ) . # " ; A-Z a-z 0-9

4 个答案:

答案 0 :(得分:1)

/\A[A-Za-z0-9&':,\().#";-]+\z/

那些所谓的特殊字符在字符类中并不特殊。

答案 1 :(得分:1)

试试这个:

$val =~ m/^[&':,\/\-().#";A-Za-z0-9]+$/;

$val如果至少有一个字符并且完全由该字符集中的字符组成,则匹配。不匹配空字符串(如果要匹配空字符串,请将最后+更改为*)。

您可以自己测试一下:

# Here's the file contents. $ARGV[0] is the first command-line parameter.
# We print out the matched text if we have a match, or nothing if we don't.
[/tmp]> cat regex.pl
$val = $ARGV[0];
print ($val =~ m/^[&':,\/\-().#";A-Za-z0-9]+$/g);
print "\n";

一些例子:

# Have to escape ( and & in the shell, since they have meaning.
[/tmp]> perl regex.pl a\(bc\&
a(bc&

[/tmp]> perl regex.pl abbb%c


[/tmp]> perl regex.pl abcx
abcx

[/tmp]> perl regex.pl 52
52

[/tmp]> perl regex.pl 5%2

答案 2 :(得分:1)

为此目的构造正则表达式有两种主要方法。首先是确保允许所有符号。另一个是确保不允许任何符号。您也可以使用音译操作符。这是一个基准:

use Benchmark 'cmpthese';

my @chars = ('0' .. '9', 'A' .. 'Z', 'a' .. 'z');
my $randstr = map $chars[rand @chars], 1 .. 16;
sub nextstr() { return $randstr++ }

cmpthese 1000000, {
    regex1 => sub { nextstr =~ /\A["#&'(),\-.\/0-9:;A-Za-z]*\z/ },
    regex2 => sub { nextstr !~ /[^"#&'(),\-.\/0-9:;A-Za-z]/ },
    tr     => sub { (my $dummy = nextstr) !~ y/"#&'(),\-.\/0-9:;A-Za-z/"#&'(),\-.\/0-9:;A-Za-z/c },
};

结果:

           Rate regex1 regex2     tr
regex1 137552/s     --   -41%   -60%
regex2 231481/s    68%     --   -32%
tr     341297/s   148%    47%     --

答案 3 :(得分:0)

/^[&':,/-().#";A-Za-z0-9]*$/