Нужна помощь с сопоставлением регулярных выражений - PullRequest
1 голос
/ 18 апреля 2011

Дано:

$num = "3";

$num_list = "30 3 42 54";

Как я могу сопоставить «3», а не «30»?Порядок номеров всегда будет меняться.

Я пытался:

if ($num_list =~ /(\s?$num\s+/)

К сожалению, он соответствует "3" в "30".Не уверен, как это исправить.Я знаю, это из-за ? означает 0 или 1.

Ваша помощь очень ценится!

Ответы [ 5 ]

5 голосов
/ 18 апреля 2011

Попробуйте использовать границы слов:

/\b$num\b/

\b будет соответствовать началу или концу строки или любой границе между символом слова и несловесным символом (то есть между [0-9a-zA-Z_] и не [0-9a-zA-Z_]).

2 голосов
/ 18 апреля 2011

Решение, которое отлично подходит, если вы собираетесь проверить, есть ли много чисел в $ num_list:

my $pat = join '|', map quotemeta, split " ", $num_list;
my $re = qr/^(?:$pat)\z/;

$num =~ $re

Решение, которое отлично подходит, если вы собираетесь проверить, много ли чиселв $ num_list:

my %num_list = map { $_ => 1 } split " ", $num_list;

$num_list{$num}

Решение, не требующее регулярного выражения (отлично подходит для SQL):

index(" $num_list ", " $num ") >= 0

Простые решения:

" $num_list " =~ / $num /

$num_list =~ /(?<!\S)$num(?!\S)/

$num_list =~ /\b$num\b/

grep { $_ == $num } split " ", $num_list
1 голос
/ 18 апреля 2011

Как насчет того, чтобы вообще не использовать регулярные выражения?

 $num = 3;
 @num_list = qw[30 3 42 54];
 if (grep { $_ == $num } @num_list) {
    ...
 }
0 голосов
/ 18 апреля 2011

Может быть что-то вроде:

$num_list = "30 3 42 54";
$num = "3";
@arr = explode(" ", $num_list);

if (scalar grep {$_ eq $num} @num_list) {
    print "Zuko!\n";
}
0 голосов
/ 18 апреля 2011

Насколько я знаю, Perl использует то же регулярное выражение, что и preg_match в PHP
Тогда вы можете попробовать следующее:

/(?<=^|\s)($num)(?=$|\s)/

У меня должно быть начало или пробел перед 3, а конец или пробел после

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