2012-03-14 4 views
2

x回繰り返したグループを見つけることができます。たとえば、スペースで区切られた文字 - 桁の組み合わせの5倍です。単純な繰り返し構文を使用できます(例:(?:\w\d){5})。固定数の繰り返しで構成されるグループの構成要素への後方参照

この5桁の英数字のスペースを別のものに置き換えたいとします。このため、私は括弧をつけて文字の桁のコンボ(スペースなし)を逆参照しようとしています:(?:(\w\d)){5}。残念ながら、5つはすべて$1に格納されます。つまり、一致するたびに$1が上書きされます。

だから、この上書きを避ける方法はありますか?または、部分文字列内だけを置き換える方法がありますか?

EDIT:

例の入力文字列:A1 A3 A4 B6 ::: A1 A3 A4 C5 B6

所望の出力文字列:A1 A3 A4 B6 ::: A1-A3-A4-C5-B6意味

、それらの5がある場合にのみスペースを交換してください。 Perlで実装されています。

+2

いくつかのサンプル入力と出力を、同様にあなたが働いている言語が助けになるからです。 – alan

答えて

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

ありがとう、それは私の問題を解決します。そういうことはPerlで( '$ _ = $ 1; tr {} { - } s; $ _'を使って' e'オプションを使って)非常に有用なものです。 – sseelenluft

3

それは醜いと融通の利かないのですが、それは本当に常に5であれば、あなたのサンプル入力が変化したことがない場合は、あなたのサンプル入力のために、そして、これは動作するはずです:

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

これは私がどこから来たのか、私の主な問題は柔軟性がないことです(私は当然Perlのループで解決できます)。 – sseelenluft

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

+0

...これはSinが投稿したnmと実質的に同じです – Beeblbrox