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
所以以$开头的任何内容都应该被转义,以及在不应该替换任何字符之后出现的数据。只有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
已经回答了:
正常工作。
答案 0 :(得分: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;
}
);