2

我想找到一个彼此重复 x 次的组,例如,由空格分隔的字母数字组合五次。我可以使用简单的重复语法,例如(?:\w\d ){5}.

然后我想用其他东西替换这个 5x 字母数字中的空格。为此,我尝试通过在其周围放置括号来反向引用每个字母数字组合(不带空格)(?:(\w\d) ){5}:. 不幸的是,所有五个都存储在 中$1,即$1每次匹配时都会被覆盖。

那么,有没有办法避免这种覆盖?或者有没有办法只在子字符串中替换一些东西?

编辑:

示例输入字符串:A1 A3 A4 B6 ::: A1 A3 A4 C5 B6

所需的输出字符串:A1 A3 A4 B6 ::: A1-A3-A4-C5-B6

这意味着,仅当其中有五个时才替换空格。在 Perl 中实现。

4

3 回答 3

3

它既丑陋又不灵活,但是对于您的示例输入,如果它真的总是五个,并且如果您的示例输入从不改变,那么这应该可以工作:

s/(\w\d) +(\w\d) +(\w\d) +(\w\d) +(\w\d) */$1-$2-$3-$4-$5/
于 2012-03-14T21:02:58.570 回答
2

如果你只是想解决问题,这样的事情

$string = 'A1 A3 A4 B6 ::: A1 A3 A4 C5 B6';
$string =~ s/(\w\d(?: \w\d){4})/$_=$1; tr{ }{-}; $_/eg;
print "'$string'\n";

否则,Perl 中的组重复确实会覆盖每个循环的捕获缓冲区。

我不知道是否有另一种编程方式。

编辑

如果要覆盖字符之间的多个空格,请添加一个 + 量词和 tr/// s- 挤压 tr/// 中的重复替换。
s/(\w\d(?: +\w\d){4})/$_=$1; tr{ }{-}s; $_/eg;


如果您有更高级的替代品,您总是可以将正则表达式与回调样式等价物 加倍

$string =~ s/(\w\d(?: +\w\d){4})/fixspaces($1)/eg;
sub fixspaces {
   my $buf = shift;
   $buf =~ s/ +/-/g;
   $buf;
}
于 2012-03-14T21:05:03.503 回答
0

这有效:

#!usr/bin/perl
sub substitute{
    $substr=shift;
$substr=~s/\s/-/gi;
return $substr;
}

$test="hello a1 b2 c3 d4 e5 testing";
$test=~s/((?:\w\d\s){4})(\w\d)\s/&substitute($1).$2." "/egi;
print $test;
于 2012-03-15T13:45:34.793 回答