2012-03-14 24 views
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中实现。

+2

一些样品的输入和输出,以及因为你在工作的语言会有所帮助。 – alan 2012-03-14 20:35:00

回答

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; 
} 
+0

谢谢,这解决了我的问题。那个人可以在很多不太可能的位置(比如''__ = $ 1; tr {} { - } s; $ _'通过'e'选项)在Perl中放入表达式,这是非常有用的。 – sseelenluft 2012-03-15 14:14:20

3

这是丑陋和不灵活,但对你的样品输入,如果真的是始终为5,如果你的样品输入从未改变,这应该工作:

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

这就是我来自哪里,对我来说主要问题是僵化(我自然可以用Perl中的循环来解决这个问题)。 – sseelenluft 2012-03-14 23:08:55

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; 
+0

(只需将量化符更改为需要连字符组合的数量,如果有8个序列将其更改为7等) – Beeblbrox 2012-03-15 13:46:50

+0

...与Sin发布的实际上完全相同,nm – Beeblbrox 2012-03-15 13:47:58