使用正则表达式

时间:2017-07-11 09:41:15

标签: javascript regex

如果我有一个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()的内部。

不确定如何实施,或者除了正则表达式之外的其他方法是否更好?

2 个答案:

答案 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);