請考慮下面的腳本,即使$ b是部分匹配,我也想匹配$ b到$ a。 這可以做到嗎?Perl部分匹配
$a="MCF-7";
$b="MCF";
if($b=~m/$a/i)
{
print "FOUND";
}
請考慮下面的腳本,即使$ b是部分匹配,我也想匹配$ b到$ a。 這可以做到嗎?Perl部分匹配
$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
功能是區分大小寫的。如果您希望進行不敏感匹配,請將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
爲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
這些模式匹配來自任何位置開始的子字符串。如果你想要它錨定在字符串的前面,build_partial
變得更簡單一點:
sub build_partial {
my ($str, $min) = (@_, 1);
my $re = join '|' => map {
quotemeta substr $str, 0, $_
} $min .. length $str;
qr/^(?:$re)$/i
}
我喜歡這種方法,但我很好奇你爲什麼使用'join'|' =>'而不是'join'|' '。 – flesk 2012-02-02 09:37:56
@flesk =>只是個人的編碼偏好。我傾向於在任何時候使用胖箭頭來描述參數之間的有用關係。所以'join''=> @ list',但不要'push @array => @list',因爲這是倒退的 – 2012-02-02 14:03:32
你似乎有$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"
沒有匹配的"MCF-7"
。
難道你不能扭轉這種感覺嗎? 'print「FOUND」if $ a =〜/ $ b/i;'? – unpythonic 2012-02-02 03:58:35