perl 从子字符串执行grep以查找匹配字符串

lqfhib0f  于 2023-03-13  发布在  Perl
关注(0)|答案(3)|浏览(223)

我有一个子字符串数组

@substringarray = ('12347', '12357', '123467', '123488')

那么我有一个完整字符串的值要求

$fullstring = '123477777777';

如何使用它来查找与的匹配项它应该返回12347
我想要这样的东西:

@testsa = grep( /^$fullstring/, @substringarray);
hkmswyz6

hkmswyz61#

你做错了--你的完整字符串不会出现在任何一个较短的子串中,是吗?
一种方法是将子字符串列表转换为匹配其中任何一个子字符串的正则表达式,并针对该正则表达式测试整个字符串:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;

my @substringarray = ('12347', '12357', '123467', '123488');
my $fullstring = '123477777777';

# Make sure to escape any characters in the strings that are special in REs
my $re = join '|', map quotemeta, @substringarray;

if ($fullstring =~ /$re/) {
  say "Found a match: $&";
} else {
  say 'No matches found.'
}

另一种方法,如果你要根据许多不同的输入来匹配子字符串,或者想找到所有的匹配项,那就是使用Algorithm::AhoCorasick::XS module,它提供了非常高效的同时搜索多个子字符串的功能:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
use Algorithm::AhoCorasick::XS;

my @substringarray = ('12347', '12357', '123467', '123488');
my $fullstring = '123477777777';

my $ac = Algorithm::AhoCorasick::XS->new(\@substringarray);

if (my $match = $ac->first_match($fullstring)) {
  say "Found a match: $match";
} else {
  say 'No matches found.'
}
9cbw7uwe

9cbw7uwe2#

你把变量弄反了!
您正在检查子字符串是否以$fullstring开头。
您希望检查$fullstring是否以子字符串开头。
这只是交换两个变量的问题。

my @testsa = grep( $fullstring =~ /^\Q$_/, @substringarray );
irlmq6kh

irlmq6kh3#

短距离,TMTOWTDI

#!/usr/bin/env perl

use strict; use warnings;

my @substringarray = ('12347', '12357', '123467', '123488');
my $fullstring = '123477777777';

print for grep { $fullstring =~ m/^$_/ } @substringarray;
输出
12347

相关问题