需要正则表达式匹配的帮助

时间:2011-04-18 18:29:47

标签: regex perl

假设:

$num = "3";

$num_list = "30 3 42 54";

如何匹配“3”而不是“30”?数字顺序总是在变化。

我试过了:

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

不幸的是它匹配“30”中的“3”。不知道如何解决它。我知道这是因为?表示0或1。

非常感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

尝试使用字边界:

/\b$num\b/

\b将匹配字符串的开头或结尾或字符和非字字符之间的任何边界(即[0-9a-zA-Z_]之间而不是[0-9a-zA-Z_]之间)。

答案 1 :(得分:2)

如果你要检查$ 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}

不需要regexp的解决方案(非常适合SQL):

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

简单的解决方案:

" $num_list " =~ / $num /

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

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

grep { $_ == $num } split " ", $num_list

答案 2 :(得分:1)

根本不使用正则表达式怎么样?

 $num = 3;
 @num_list = qw[30 3 42 54];
 if (grep { $_ == $num } @num_list) {
    ...
 }

答案 3 :(得分:0)

据我所知,Perl在PHP中使用与preg_match相同的正则表达式 然后你可以尝试以下方法:

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

我应该在3之前有一个开头或空格,然后是结尾或空格

答案 4 :(得分:0)

可能是这样的:

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

if (scalar grep {$_ eq $num} @num_list) {
    print "Zuko!\n";
}