反向引用由固定数量的重复组成的组的成分

时间:2012-03-14 20:26:08

标签: regex perl backreference repeat

我希望找到一个彼此重复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中实现。

3 个答案:

答案 0 :(得分:3)

它很丑陋而且不灵活,但是对于你的样本输入,如果它总是五个,如果你的样本输入永远不变,这应该有效:

s/(\w\d) +(\w\d) +(\w\d) +(\w\d) +(\w\d) */$1-$2-$3-$4-$5/

答案 1 :(得分: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 ///中添加+量词和tr /// s - 压缩重复替换。
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;
}

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