假设:
$num = "3";
$num_list = "30 3 42 54";
如何匹配“3”而不是“30”?数字顺序总是在变化。
我试过了:
if ($num_list =~ /(\s?$num\s+/)
不幸的是它匹配“30”中的“3”。不知道如何解决它。我知道这是因为?
表示0或1。
非常感谢您的帮助!
答案 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";
}