Perl:在两个字符串之间传递子字符串位置

时间:2013-04-05 14:07:21

标签: string algorithm perl substring

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

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

我有什么:

  • 子串在此原始字符串中的位置:Start = 1,End = 4
  • 带有附加连字符的原始字符串:“ - AB --- CD - E-F ---”

我想要的是什么:

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

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

3 个答案:

答案 0 :(得分: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---

答案 1 :(得分: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";

答案 2 :(得分: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;
}