gpt4 book ai didi

javascript - 使用正则表达式将属性替换为函数

转载 作者:行者123 更新时间:2023-12-03 03:54:04 25 4
gpt4 key购买 nike

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

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

最佳答案

您可以进行递归查找和替换,例如:

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));
});

更新:2017年9月16日

我已将正则表达式从: /(\w+\.)*foo/g 更改为: /((?:\w+\.)*)foo/g 因为第一个匹配组时出现问题:它将仅匹配最后一个 \w\.,但不会匹配所有 \w\.\w\.\w\... .。当我第一次发布答案时,它似乎起作用了。我发布答案时没有注意到。关于这个问题的进一步阅读here .

关于javascript - 使用正则表达式将属性替换为函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45030865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com