$a='program';
$b='programming';
if ($b=~ /[$a]/){print "true";}
这不起作用
感谢每一个我都有点困惑
答案 0 :(得分:3)
正则表达式中的[]
是指与其中列出的任何一个字符匹配的字符类。
你的正则表达式相当于:
$b=~ /[program]/
,在p
中找到字符$b
时返回true。
要查看匹配是否发生,您正在打印true
,打印true
将不会显示任何内容。尝试打印别的东西。
但如果您想查看另一个字符串是否存在于另一个字符串中,则必须将[..]
删除为:
if ($b=~ /$a/) { print true';}
如果变量$a
包含任何正则表达式元字符,则上述匹配将无法解决将{regex}置于\Q
和\E
之间的问题,以便正则表达式中的任何元字符都将被转义:< / p>
if ($b=~ /\Q$a\E/) { print true';}
答案 1 :(得分:3)
假设任一变量可能来自外部输入,请引用正则表达式中的变量:
if ($b=~ /\Q$a\E/){print true;}
当您要查找的模式包含“{1}}中的任何一个”保留字符“时,您将不会被刻录。
答案 2 :(得分:2)
(除了丢失的分号:)为什么要将$a
放在方括号中?这使它成为可能的字符列表。尝试:
$b =~ /\Q${a}\E/
回答有关=
和=~
的评论:
=~
是匹配运算符,并在上面的示例中指定要应用正则表达式($b
)的变量。如果省略=~
,则Perl会自动使用隐含的$_ =~
。($match1, $match2) = $b =~ /.../;
。另一方面,如果将结果分配给标量,则标量将被赋予该数组中元素的数量。所以如果你写$b = /\Q$a\E/
,你最终会得到$b = $_ =~ /\Q$a\E/
。
答案 3 :(得分:1)
$a='program';
$b='programming';
if ( $b =~ /\Q$a\E/) {
print "match found\n";
}
答案 4 :(得分:0)
如果你只是在寻找一个字符串是否包含在另一个字符串中而不需要使用任何字符类,量词等,那么就没有必要启动正则表达式引擎来进行精确的字面匹配。请考虑使用index
:#!/ usr / bin / env perl
#!/usr/bin/env perl
use strict;
use warnings;
my $target = 'program';
my $string = 'programming';
if (index($string, $target) > -1) {
print "target is in string\n";
}