gpt4 book ai didi

Perl 部分匹配

转载 作者:行者123 更新时间:2023-12-05 00:48:11 24 4
gpt4 key购买 nike

请考虑下面的脚本,即使 $b 是部分匹配,我也想将 $b 匹配到 $a。
这能做到吗?

$a="MCF-7";
$b="MCF";
if($b=~m/$a/i)
{
print "FOUND";
}

最佳答案

虽然正则表达式可以做到这一点,但听起来您的问题也可以用 index 解决。功能:

say index($haystack, $needle) >= 0 ? 'match' : 'fail'; # any position
say index($haystack, $needle) == 0 ? 'match' : 'fail'; # anchored at start
index函数区分大小写。如果你想要一个不敏感的匹配,应用 uclc函数到两个参数。

虽然 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

MCF-7 生成的正则表达式看起来像这样:
/^(?:M|C|F|7|MC|CF|\-|MCF|F\-|\-7|CF\-|F\-7|MCF\-|CF\-7|MCF\-7)$/i

即使针是大海捞针中的单个字符,它也会匹配。 build_partial采用一个可选数字,指示匹配所需的最小长度:
my $regex_3 = build_partial $haystack, 3;

产生这个正则表达式:
/^(?:MCF|CF\-|F\-7|MCF\-|CF\-7|MCF\-7)$/i

这些模式匹配从任何位置开始的子字符串。如果您希望它 anchor 定在字符串的前面, build_partial变得简单一点:
sub build_partial {
my ($str, $min) = (@_, 1);

my $re = join '|' => map {
quotemeta substr $str, 0, $_
} $min .. length $str;

qr/^(?:$re)$/i
}

关于Perl 部分匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9106978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com