6

文字列を正規表現で処理し、x->y を変更する必要があります。

文字列:2x2x2 2x 2x2x 2x2x2x2x2

正規表現:s/([0-9])x([0-9])/$1y$2/g

my $string = "2x2x2 2x 2x2x 2x2x2x2x2";

$string =~ s/([0-9])x([0-9])/$1y$2/g;

print "$string\n";

私が期待する:2y2y2 xx 2x 2y2x 2y2y2y2y2

しかし、結果: 2y2x2 2x 2y2x 2y2x2y2x2(すべての 2x2 が変更されたわけではありません)

私は何をすべきか?

4

2 に答える 2

8

以下の正規表現を試してください。

s/(?<=\d)x(?=\d)/y/g
于 2012-10-06T07:28:05.217 に答える
2

明確に言うと、その理由は、式"2x2x2""2y2x2"最初に に一致"2x2"し、それを に置き換え、その一致が見つかった"2y2"に検索を再開するためです。次のビットは、あなたのパターンと一致しません。"x2"

@xdazz のソリューションが機能する理由は、ルックアラウンド アサーションが実際には文字列の文字を消費しないためです。文字列で一致する部分は"x"、数字が前後にある場合は常に , です。

ちなみに、@xdazz の から[0-9]への変更は実際に\dはあまり変わりませんが、わずかに異なります。\d数字と見なされる他の Unicode 文字にも一致します[0-9]が、指定された範囲内の正確な 10 文字のみに一致します。

于 2012-10-08T15:22:23.017 に答える