Perl部分匹配

Pin*_*ink 3 perl

请考虑下面的脚本,即使$ b是部分匹配,我也要将$ b与$ a匹配.可以这样做吗?

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

Eri*_*rom 8

虽然正则表达式可以做到这一点,但听起来您的问题也可以通过index函数解决:

say index($haystack, $needle) >= 0 ? 'match' : 'fail'; # any position
say index($haystack, $needle) == 0 ? 'match' : 'fail'; # anchored at start
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

生成的正则表达式MCF-7如下所示:

/^(?:M|C|F|7|MC|CF|\-|MCF|F\-|\-7|CF\-|F\-7|MCF\-|CF\-7|MCF\-7)$/i
Run Code Online (Sandbox Code Playgroud)

即使针是大海捞针中的一个字符,它也会匹配. build_partial取一个可选数字,表示匹配所需的最小长度:

my $regex_3 = build_partial $haystack, 3;
Run Code Online (Sandbox Code Playgroud)

产生这个正则表达式:

/^(?:MCF|CF\-|F\-7|MCF\-|CF\-7|MCF\-7)$/i
Run Code Online (Sandbox Code Playgroud)

这些模式匹配从任何位置开始的子字符串.如果你想将它锚定在字符串的前面,那就build_partial更简单了:

sub build_partial {
    my ($str, $min) = (@_, 1);

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

    qr/^(?:$re)$/i
}
Run Code Online (Sandbox Code Playgroud)


小智 7

你似乎有$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";
}
Run Code Online (Sandbox Code Playgroud)

你问题中的代码没有输出,因为"MCF-7"内部没有匹配"MCF".