1

_# を追加して各単語/プロパティをインクリメントしようとしているこの文字列があり、 # は の左側にインクリメントされた番号{です。

 str = 'View{Image{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button_2{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}'

過去にこの正規表現を使用しましたが、機能せず、理由がわかりません。

var i = {};
str = str.replace(/(\S+):{/g, function (m, p1) {
            i[p1] = (i[p1] || 0) + 1;
            return p1 + "_" + i[p1].toString() + ":{";
        });

望ましい出力は次のとおりです。

str = 'View_1{Image_1{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button_1{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button_2{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}'
4

2 に答える 2

1

いくつかの小さな、しかし重要な変更がそれを機能させるはずです。

まず、あなたのに小さな間違いがあると思いますstr。たとえば、あなたはButton_2終わりにstr近づいていますが、私はあなたがこれを望んでいButtonて、あなたのreplace関数が増分を処理することを想定しています。そうでなければ、結果は次のようになりButton_2_1ます...だから私はあなたstrがこれになりたいと思っていると思います:

str = 'View{Image{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}'

もしそうなら、ここに修正されたコード(私はあなたのために働くことを願っています)があり、その後に説明があります:

var i = {};

str = str.replace(/(\w+){/g, function (m, p1) {
    i[p1] = (i[p1] || 0) + 1;
    return p1 + "_" + i[p1].toString() + ":{";
});

元のコード\Sでは括弧内にありましたが、これは一般的すぎます。これは、最初の中括弧もキャプチャするため{です。正規表現では、大文字はスペースではない\S文字を意味します。小文字は英数字を検索するので、これはおそらく単語やなどをキャプチャしたいものです。したがって、文字列の英数字部分の直後に(スペースなしで)開き中括弧が続く場合は、アンダースコアと数字に置き換えられます。 、そのアイテムのインスタンスごとに増分します。\wViewImage

各番号の後にコロンを実際に表示するかどうかわからなかったので、そのままにしておきましたが、実際にコロン:を表示したくない場合は、returnステートメントを次のように置き換えてください。return p1 + "_" + i[p1].toString() + "{";

それ以外の場合、上記(コロンを含む)に満足している場合、これは結果の文字列です:

View_1:{Image_1:{BackgroundImage: Image.png;Position: 0, 0;Width: 320;Height: 480;}Button_1:{BackgroundImage: ButtonTop.png;Position: 61, 83;Width: 217;Height: 58;}Button_2:{BackgroundImage: ButtonBottom.png;Position: 21, 303;Width: 217;Height: 58;}}

私はあなたが望んでいたものだと思います。修正されたコードの動作を確認してプレイできるように、フィドルを設定しました。

お役に立てれば。

于 2013-01-06T18:23:12.467 に答える
1

:あなたの正規表現によると、左中括弧の前にあるコロンを探しています{が、これは文字列にはありません。文字列の先頭を次のように変更してみてください。

str = 'View:{Image...';

更新: 変数に何が含まれているかわかりませんi- 常に空のオブジェクトですか? ただし、数値を増やし続けると、この置換関数がうまく機能する可能性があります ( demo )。

str = str.replace(/([a-zA-Z]+_?)(\d+)?:{/g, function (m, n, d) {
  d = (parseInt(d,10) || 0) + 1; // add one
  if (!/_$/.test(n)) { n += '_'; } // add _ if name doesn't have it
  return n + d + ":{";
});
于 2013-01-06T18:03:03.693 に答える