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