-1

我正在编写一个 Perl 程序,但遇到了以下问题:我有一个字符串中的开始和结束位置的大列表。该位置对应于该字符串中的子字符串。我现在想将此位置转移到第二个字符串。第二个字符串与第一个字符串相同,只是它有额外的连字符。

原始字符串示例:“ABCDEF”和一个子字符串“BCDE”

我有的:

  • 此原始字符串中子字符串的位置:开始 = 1,结束 = 4
  • 带有附加连字符的原始字符串:“-AB---CD--EF---”

我想要的是:

  • 连字符字符串中子字符串的位置:Start=2, End=10

我有一个很大的这个子字符串位置的列表。

4

3 回答 3

1

我强烈怀疑您已经展示了问题的简化版本,在这种情况下,任何解决方案都可能不适用于实际情况。

-*然而,通过在字符之间穿插(即零个或多个连字符)来构建正则表达式似乎是最简单的。

该程序以这种方式工作,构建一个正则表达式B-*C-*D-*E并将其与两个示例字符串进行比较。

use strict;
use warnings;

my @strings = qw/ ABCDEF -AB---CD--E-F--- /;
my ($start, $end) = (1, 4);
my $substr = substr $strings[0], $start, $end-$start + 1;

my $regex = join '-*', split //, $substr;
$regex = qr/$regex/;

for my $string (@strings) {
  if ($string =~ $regex) {
    printf "Substring found at %d to %d in string %s\n", $-[0], $+[0]-1, $string;
  }
}

输出

Substring found at 1 to 4 in string ABCDEF
Substring found at 2 to 10 in string -AB---CD--E-F---
于 2013-04-05T14:28:18.307 回答
0
use strict;
use warnings;
my $theStringGivenAsAnInputExample="-AB---CD--E-F---";
my $start=1;
my $end=4;
my $theStringGivenAsAnotherInput="ABCDEF";
my $regexp=join("-*",split("",substr($theStringGivenAsAnotherInput,$start,$end))
);
$theStringGivenAsAnInputExample =~ /$regexp/p;

print ${^PREMATCH},"\n";
print ${^POSTMATCH},"\n";
print ${^MATCH},"\n";

my $startPosition = length(${^PREMATCH});
my $finishPosition = length(${^PREMATCH})+length(${^MATCH})-1;

print "start, $startPosition finish, $finishPosition\n";
于 2013-04-05T14:28:15.767 回答
0

这对你有用吗?它只是在连字符字符串中搜索由 start 和 end 指定的字符并返回它们的索引。

sub hyphen_substrings {
    my $original   = shift;
    my $hyphenated = shift;
    my @substrings = @_;
    my @return;
    for my $substring (@substrings) {
        my ($start, $end) = @{$substring}[0, 1];
        my $start_h       = index $hyphenated, substr $original, $start, 1;
        my $end_h         = index $hyphenated, substr $original, $end, 1;
        push @return, [$start_h, $end_h];
    }
    return @return;
}
于 2013-04-05T14:29:27.673 回答