Perl部分匹配 请考虑下面的脚本,我想匹配$B到$A,即使$B是部分匹配。 这能做到吗 $a="MCF-7"; $b="MCF"; if($b=~m/$a/i) { print "FOUND"; }
您似乎把Perl部分匹配 请考虑下面的脚本,我想匹配$B到$A,即使$B是部分匹配。 这能做到吗 $a="MCF-7"; $b="MCF"; if($b=~m/$a/i) { print "FOUND"; },perl,Perl,您似乎把$a和$b混在了一起: use strict; use warnings; my $a="MCF-7"; my $b="MCF"; if($a=~/$b/i) #tests for case-insensitive matching of $b within $a. { print "Found\n"; } 您问题中的代码没有产生任何输出,因为“MCF-7”中没有匹配的“MCF-7”,而正则表达式可以做到这一点,听起来您的问题也可以通过index函数解决: say index($ha
$a
和$b
混在了一起:
use strict;
use warnings;
my $a="MCF-7";
my $b="MCF";
if($a=~/$b/i) #tests for case-insensitive matching of $b within $a.
{
print "Found\n";
}
您问题中的代码没有产生任何输出,因为
“MCF-7”
中没有匹配的“MCF-7”
,而正则表达式可以做到这一点,听起来您的问题也可以通过index
函数解决:
say index($haystack, $needle) >= 0 ? 'match' : 'fail'; # any position
say index($haystack, $needle) == 0 ? 'match' : 'fail'; # anchored at start
index
函数区分大小写。如果需要不敏感的匹配,请对这两个参数应用uc
或lc
函数
尽管index
函数比正则表达式快得多,但如果您确实需要正则表达式解决方案,可以构建一个正则表达式生成器,生成一系列交替,以执行部分匹配
sub build_partial {
my ($str, $min) = (@_, 1);
my @re;
for (0 .. length($str) - $min) {
my $str = substr $str, $_;
for ($min .. length $str) {
push @re, quotemeta substr $str, 0, $_
}
}
my $re = join '|' => sort {length $a <=> length $b} @re;
qr/^(?:$re)$/i
}
my $haystack = 'MCF-7';
my $needle = 'MCF';
my $regex = build_partial $haystack;
say $needle =~ /$regex/ ? 'match' : 'fail'; # match
即使针是干草堆中的单个字符,它也会匹配<代码>build_partial采用一个可选数字,指示匹配所需的最小长度:
my $regex_3 = build_partial $haystack, 3;
生成此正则表达式的:
/^(?:MCF|CF\-|F\-7|MCF\-|CF\-7|MCF\-7)$/i
这些模式匹配从任何位置开始的子字符串。如果希望将其锚定到字符串的前面,build\u partial
会变得更简单一些:
sub build_partial {
my ($str, $min) = (@_, 1);
my $re = join '|' => map {
quotemeta substr $str, 0, $_
} $min .. length $str;
qr/^(?:$re)$/i
}
你就不能改变这种感觉吗<如果$a=~/$b/i,则代码>打印“已找到”代码>?我喜欢这种方法,尽管我想知道为什么你使用
join'|'=>
而不是join'|',
@flesk=>只是个人编码偏好。我倾向于在任何时候使用胖箭头,它在参数之间绘制有用的关系。因此,join'=>@list
而不是push@array=>@list
,因为这是向后的
sub build_partial {
my ($str, $min) = (@_, 1);
my $re = join '|' => map {
quotemeta substr $str, 0, $_
} $min .. length $str;
qr/^(?:$re)$/i
}