使用正则表达式将属性替换为函数
Posted
技术标签:
【中文标题】使用正则表达式将属性替换为函数【英文标题】:Replace property with function using regex 【发布时间】:2017-07-11 09:41:15 【问题描述】:如果我有一个 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() 的内部。
不确定如何实现,或者除了正则表达式之外的其他方法是否更好?
【问题讨论】:
为什么要这样做? 因为我需要在 getFoo() 函数中输入一些逻辑,然后它只会在某些条件通过时返回 foo,否则返回其他内容。 为什么不创建 getFoo 对象并对其进行扩展(例如浅拷贝,或原型设计..) 你的意思是使用 Object.defineProperty 在我检查的地方添加另一个“getFoo”属性。我不想为所有对象添加此属性,因为它大多不会出现 【参考方案1】:您可以像这样进行 recusive 查找和替换:
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。
【讨论】:
【参考方案2】:尝试使用基本原型设计的其他方法,您可以创建一些原型来按照您的意愿“混合”您的功能,做几个原型(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);
【讨论】:
不要只是编写代码,而是尝试解释它的作用。此外,我不明白它与问题有何关系以上是关于使用正则表达式将属性替换为函数的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式替换 char 并在 .net C# 中转换为大写
Pandas Dataframe - 根据正则表达式条件替换所有单元格值
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容