我想你真的想找到最长的重叠子匹配。如果您可以保证交替中的子字符串按照您喜欢的顺序排列,那么这种方法可能会起作用,但它还需要了解除了匹配之外以及未来匹配中发生的情况。也就是说,在获得可能重叠的未来匹配之前,您不知道是否可以输出任何内容,并且您无法判断需要查看多远的未来。
你可以乱搞pos
,但我想我只是分别匹配每个子字符串,记住起始位置,然后进行比较。将问题分解为单独的任务,以查找匹配的位置并确定您想要的位置。
即使我编写了与您提供的相同的代码,如果我在长时间缺席后再次看到它(即使我确实突出显示了它),我也不太可能记住必须发生的所有事情以使一切顺利进行@-
and @+
在第一章中掌握 Perl https://www.masteringperl.org ;)
use v5.10;
use strict;
my $target = "_abcbabc_bacba";
my @looking_for = qw( abc cba b );
my @found;
foreach my $want ( @looking_for ) {
my $pos = 0;
while( my $found_at = index $target, $want, $pos ) {
last if $found_at == -1;
push @found, $found_at;
$pos = $found_at + 1;
}
}
my @found = sort { $a->[1] <=> $b->[1] } @found;
use Data::Dumper;
say Dumper( \@found );
现在你有了一个数据结构,你可以用你喜欢的任何方式来处理,而不用在正则表达式中考虑所有这些东西。您决定如何做到这一点留给读者作为练习。
$VAR1 = [
[
'abc',
1
],
[
'b',
2
],
[
'cba',
3
],
[
'b',
4
],
[
'abc',
5
],
[
'b',
6
],
[
'b',
9
],
[
'cba',
11
],
[
'b',
12
]
];
其中一部分可能是内联的。您可以构建这个数据结构,直到您知道到目前为止所拥有的一切都可以产生输出(i.e.您刚刚匹配的内容与之前的内容不重叠)。