如果我有一个JavaScript表达式,我想用一个函数替换特定属性的所有实例。例如:
foo => getFoo()
a.b.foo => getFoo(a.b)
a.foo.b => getFoo(a).b
a.foo.foo => getFoo(getFoo(a))
a.foo.b.foo => getFoo(getFoo(a).b)
a.foo+b.foo||c.foo => getFoo(a)+getFoo(b)||getFoo(c)
a(b.foo) => a(foo(b))
我需要检查字符,这意味着特定变量的结束或开始是'','|','&','(',')',',', '+',' - ','=','<','>'
如果我到达字符串'foo',我需要将上面列出的字符之后的所有字符移动到getFoo()的内部。
不确定如何实施,或者除了正则表达式之外的其他方法是否更好?
答案 0 :(得分:1)
你可以做一个recusrive find&替换如:
function replacer(match, params) { // the match could be 'a.foo.b.c.foo' and params is then 'a.foo.b.c.'
if(params) params = params.slice(0, -1); // if there is params, then cut the last '.' out
return "getFoo(" + parse(params) + ")"; // the parsed version of params wrapped in a getFoo call
}
function parse(text) {
if(!text) return ""; // if text is empty or undefined then return the empty string
return text.replace(/((?:\w+\.)*)foo/g, replacer); // otherwise match all text before before (a sequence of identifier followed by '.') 'foo' ('a.foo.b.c.foo' the group will be 'a.foo.b.c.') and then use the replacer function to replace the match
}
[
"foo",
"a.b.foo",
"a.foo.b",
"a.foo.foo",
"a.foo.b.foo",
"a.foo+b.foo||c.foo",
"a(b.foo)",
].forEach(function(t) {
console.log(t, "=>", parse(t));
});

更新:16/09/2017
我已将正则表达式从/(\w+\.)*foo/g
更改为:/((?:\w+\.)*)foo/g
,因为第一个匹配该组时出现问题:它只匹配最后一个\w\.
但不匹配所有{{1} }}。当我第一次发布答案时,似乎有效。当我发布答案时,我没有注意到它。进一步阅读有关此问题here。
答案 1 :(得分:0)
尝试使用基本原型制作的其他方法,您可以创建一些原型来"混合"你的功能就像你想要的那样,做一些原型(js prototype)比在函数中转换你的字符串(js string to function)更干净:
function Toolbox(name){
this.name = "im "+name;
this.a = function(){
return 1;
}
this.b = function(){
return 2;
}
this.c = function(){
return this.a + this.b;
}
}
// create a new Toolbox
var uniqToolbox = new Toolbox("Julien");
// extend
uniqToolbox.d = function(){
return true;
}
alert(uniqToolbox.name);