0

JSFiddler: http: //jsfiddle.net/A3vg6/20/

    var regex = /(?:window|scope|data|owner)(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*/gi;

    var path = [];
    var vars = [];

    var ms = txt.replace(regex,
        function (match) {
        var nv = "v" + (path.length + 1);
            if (match.indexOf("owner.")==0) {
                match = match.substr(6);
            }
            path.push(match);
            vars.push(nv);
            return nv;
        }
        );

出力を取得しています

data.x + data.y + $data.z + xdata => v1 + v2 + $v3 + xv4

しかし、正しい出力は、

data.x + data.y + $data.z + xdata => v1 + v2 + data.z + xdata

したがって、$で始まるものはすべてエスケープする必要があります。また、文字の後にデータが表示される場合は、置き換えないでください。キーワードは、window、scope、data、ownerの4つだけです。これらの単語は、変数に置き換える必要があります。

正規表現は嫌いですが、複雑なシーケンスが含まれるため、正規表現にする必要があります。

data[ Calculate( x, data.y)] => v1[ Calculate(x,v2)]

現在はほとんど成功していませんが、新しいシーケンスに問題があります

data[data['x']] + data.x + data.y + $data.y + xdata

になる

v1v2['x']] +v3 +v4 + data.y + xdata

しかし、それは

v1[v2['x']] +v3 +v4 + data.y + xdata

回答:

http://jsfiddle.net/A3vg6/44/

正しく動作します。

4

1 に答える 1

1

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

/(^|[^\w])(?:window|scope|data|owner)(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*/gi

関数を次のように変更します。

var ms = txt.replace(regex,
        function (match, prefix) {
            if (prefix == "$") return match.substr(1);
            var nv = "v" + (path.length + 1);
            match = match.substr(1);
            if (match.indexOf("owner.")==0) {
                match = match.substr(6);
            }
            path.push(match);
            vars.push(nv);
            return prefix + nv;
        }
        );

ここで試してください:http://jsfiddle.net/A3vg6/40/

于 2012-05-16T13:29:17.720 に答える