如何在函数声明字符串中匹配“obj.foo”

时间:2012-04-15 22:39:32

标签: javascript regex

假设我有一个表示为字符串的函数表达式

"var someFunction = function (foo) { foo.bar = 'hello'; };"

如何在该字符串中安全地识别foo.bar的所有有效(就js语法而言)?

即。避免像"catfoo.barbar"这样的实例我想用其他东西替换这些引用。

(有人肯定会问......是的,我正在使用eval,是的,这在我的用例中是有意义的)


我正在寻找的最重要的事情是如何匹配有效的对象名称。如何匹配对象名称中所有有效字符的集合?他们甚至是什么?像áéíóú这样的字符显然是有效的字符,所以它比[0-9a-zA-Z_]

更复杂一些

说明我真正想做的事情。我有一个函数,我在其中注入具有属性的对象

function shader(src, dst, out) {
    out.a = (src.a + dst.a)/2;
}

为2D画布上的每个像素调用此方法。我想要做的是内联此函数,并以合理的方式删除所有的点运算符。

...
var src = {}, dst = {}, out = {};
...

for (i = 0; i < len; i += 4) {
    shader(src, dst, out);
}

内联着色器后变为

...
var src = {}, dst = {}, out = {};
...

for (i = 0; i < len; i += 4) {
   out.a = (src.a + dst.a)/2;
}

但我还想删除点运算符。我真的不确定性能提升会是什么,它可能是一种无用的微优化。内联函数至少可以使FF的性能提高100%。无论如何,我很好奇如何做到这一点。原始函数用于后备和易于定义。

2 个答案:

答案 0 :(得分:1)

这是一个用javascript编写的javascript解析器:https://github.com/douglascrockford/JSLint/blob/master/jslint.js

它将生成一个很好的解析树。祝你好运。

答案 1 :(得分:0)

您可以使用此正则表达式:

  /(?=[{\s])foo.bar(?=[\s])/

使用string.replace,如下所示:

  var replaced = original.replace(/(?=[{\s])foo.bar(?=[\s=])/g, "replacement");

括号[\s{]之间的第一个组,在单词foo之前找到{或间距字符(空格,制表符等)。第二组[\s=]在条形后找到间距字符或等号。如果您发现有其他可能性,您可以更改它。 (?=...)匹配字符串,但不包含在匹配项中。这意味着找到间距字符或大括号或等号,但不包括在匹配中,因此不会替换。

最终/g表示找到所有匹配项。如果你知道只有一个你可以省略它。