2

x回繰り返されるグループを見つけたいと思います。たとえば、スペースで区切られた文字と数字の組み合わせを5回繰り返します。単純な繰り返し構文を使用できます(?:\w\d ){5}

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

それで、この上書きを回避する方法はありますか?または、部分文字列のみで何かを置き換える方法はありますか?

編集:

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

必要な出力文字列:A1 A3 A4 B6 ::: A1-A3-A4-C5-B6

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

4

3 に答える 3

3

醜くて柔軟性がありませんが、サンプル入力の場合、実際には常に5であり、サンプル入力が変化しない場合は、次のように機能するはずです。

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///を追加します-tr///sに重複する置換を押しつぶします。
s/(\w\d(?: +\w\d){4})/$_=$1; tr{ }{-}s; $_/eg;

より洗練された代替品がある場合は、
同等 のコールバックスタイルで正規表現をいつでも2倍にすることができます

$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 に答える