【问题标题】:Perl: Transfer substring positions between two stringsPerl:在两个字符串之间传输子字符串位置
【发布时间】:2013-03-27 23:52:14
【问题描述】:

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

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

我有什么:

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

我想要什么:

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

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

【问题讨论】:

  • 请向我们展示您的尝试,也许我们可以提供帮助。如果您需要学习 Perl,请尝试Modern Perl Book
  • 子串字符是否必须以相同的顺序出现,即“-AC-BD-E-F”不匹配?

标签: string algorithm perl substring


【解决方案1】:
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";

【讨论】:

  • 总是 use strictuse warnings,请使用合理的变量名。
  • @Borodin 为你的快乐而改变
【解决方案2】:

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

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

这个程序就是这样工作的,构建一个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---

【讨论】:

    【解决方案3】:

    这对你有用吗?它只是在连字符字符串中搜索 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-02-04
      • 2015-04-10
      • 2016-02-10
      • 2014-12-07
      • 2013-12-31
      • 2012-03-10
      • 2013-09-14
      • 1970-01-01
      相关资源
      最近更新 更多