Как написать регулярное выражение Perl, которое будет соответствовать строке только с этими символами? - PullRequest
2 голосов
/ 17 февраля 2010

Я довольно новичок в регулярных выражениях. Я хочу написать регулярное выражение, которое проверяет, имеет ли данная строка только определенные символы. Если в строке есть любые другие символы, кроме этих, она не должна совпадать.

Символы, которые я хочу:

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

Ответы [ 4 ]

1 голос
/ 18 февраля 2010

Существует два основных подхода к созданию регулярного выражения для этой цели. Во-первых, убедитесь, что все символы разрешены. Другой - убедиться, что никакие символы не допускаются. И вместо этого вы также можете использовать оператор транслитерации. Вот эталон:

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%     --
1 голос
/ 17 февраля 2010

Попробуйте это:

$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
1 голос
/ 17 февраля 2010

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

Эти так называемые специальные символы не являются специальными в классе символов.

0 голосов
/ 17 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...