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

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 - 根据正则表达式条件替换所有单元格值

在正则表达式中转义特殊字符

正则表达式替换为c ++ 11中的回调?

php正则表达怎么把一个字符串中的所有空格都转化为下划线

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容