Arrays 如何将array1中的元素部分与array2中的元素进行匹配?
我有一个关于匹配数组元素部分的问题 我有两个阵列: @1=SMITH SMIT MITH SMI MIT ITH(史密斯姓氏的一部分) @2=150000个姓氏的列表 我需要在@2中搜索@1中的元素,然后打印@2中匹配的全部姓氏 例如: 如果SMITHERS在@2:中,则打印“SMITHERS”(因为SMITH、SMIT、MITH、SMI、MIT、ITH匹配) 如果MITCHELL在@2:print“MITCHELL”(因为MIT匹配) 如果SCHMITTY在@2:print中,则打印“SCHMITTY”(因为MIT匹配)Arrays 如何将array1中的元素部分与array2中的元素进行匹配?,arrays,perl,element,matching,Arrays,Perl,Element,Matching,我有一个关于匹配数组元素部分的问题 我有两个阵列: @1=SMITH SMIT MITH SMI MIT ITH(史密斯姓氏的一部分) @2=150000个姓氏的列表 我需要在@2中搜索@1中的元素,然后打印@2中匹配的全部姓氏 例如: 如果SMITHERS在@2:中,则打印“SMITHERS”(因为SMITH、SMIT、MITH、SMI、MIT、ITH匹配) 如果MITCHELL在@2:print“MITCHELL”(因为MIT匹配) 如果SCHMITTY在@2:print中,则打印“SCHM
如果JONES在@2:blank中(因为没有匹配项)您使用的是什么编程语言?@shmiddy啊,对不起,Perl@ikegami-为什么不使用,因为它从
@a1
创建以下模式:(?^:(?:SMI(?:TH?)| MITH?| ITH))
?@Kenosis,因为两个受支持的Perl版本(5.14和5.16)之前的两个版本(5.10和5.12)已经做到了!请参见perl-Mre=debug-e'qr/foo | fudge | bar | mooo/'
@Kenosis中的“TRIE”,另外,Regexp::Assemble用于模式的交替。列表用于字符串的交替。不必对后者使用quotemeta。@ikegami-也许我不明白。您的代码生成的模式如下:(?^u:SMITH | SMIT | MIT | MIT | ITH)
,而Regexp::assembly生成:(?^:(?:SMI | TH?| MITH | ITH))
@kenosis,SMIT | MIT | MIT
编译为SMI | ITH | MITH?/code>。同样,请参见生成的正则表达式代码中的“TRIE”。它现在内置于正则表达式引擎本身。
use feature qw( say );
my @a1 = qw( SMITH SMIT MITH SMI MIT ITH );
my @a2 = qw( SMITHERS MITCHELL SCHMITTY JONES );
my $pat =
join '|',
map quotemeta,
sort { length($b) <=> length($a) }
@a1;
my $re = qr/$pat/;
for (@a2) {
say if /$re/;
}
use feature qw( say );
my $a1 = 'SMITH';
my @a2 = qw( SMITHERS MITCHELL SCHMITTY JONES );
my $pat =
join '|',
map quotemeta,
$a1 =~ /(?=(...))./sg;
my $re = qr/$pat/;
for (@a2) {
say if /$re/;
}