我正在写一个Perl程序,我遇到了以下问题: 我在一个字符串中有一个很大的开始和结束位置列表。此位置对应于此字符串中的子字符串。我现在想把这个位置转移到第二个字符串。第二个字符串与第一个字符串相同,只是它有附加的连字符。
原始字符串的示例:“ABCDEF”和一个子字符串“BCDE”
我有什么:
我想要的是什么:
我有一个很大的子字符串位置列表。
答案 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;
}