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

How do I match "obj.foo" in a function declaration string

本文关键字:obj foo 函数 声明 字符串      更新时间:2023-09-26

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

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

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

即避免出现类似 "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%。我很好奇无论如何该怎么做。原始函数的存在是为了回退和易于定义。

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

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

您可以使用

以下正则表达式:

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

使用 string.replace,如下所示:

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

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

最后/g意味着找到所有匹配项。如果你知道只有一个,你可以省略它。