我对正则表达式很新。我想写一个正则表达式来验证给定的字符串是否只有某些字符。如果字符串中包含除此之外的任何其他字符,则不应匹配。
我想要的角色是:
& ' : , / - ( ) . # " ; A-Z a-z 0-9
答案 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]*$/