使用来自匹配的对象属性查找的Javascript正则表达式替换是“未定义的”

时间:2016-11-23 00:40:14

标签: javascript regex

尝试执行正则表达式替换时遇到以下问题:

这是我的字符串和正则表达式:

var content = "This is the city of {{city}}, located in the county of {{county}} and the state of {{state}}"
content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, '$1')
  

“这是城市,位于县城和州”

这是我的正则表达式替换的上下文对象:

var context = {city: "Abanda", county: "Chambers County", state: "Alabama"}
content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, context['$1'])
  

“这是未定义的城市,位于未定义的县和未定义的状态”

为什么我的正则表达式替换为undefined失败?我正在关注MDN的正则表达式替换和匹配文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#special-capturing-parentheses

在调试此问题时,我得到以下内容,强调在访问regex replace方法中的对象属性时可能存在问题:

content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, '$1')
  

“这是城市,位于县城和州”

content.replace(/\{\{([a-zA-Z0-9]*)\}\}/g, context)
  

这是[object Object]的城市,位于[object Object]的县和[object Object]的状态

任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:4)

context['$1'] 未定义;您的$1对象上没有名为context的属性。

您可以提供回调函数作为String.prototype.replace(pattern, callback)的第二个参数,而不是静态替换值。 将为每个匹配调用回调函数...接收匹配的文本和任何捕获组值作为参数。您可以根据这些值进行处理,并在上下文中返回替换值。



var content = "This is the city of {{city}}, located in the county of {{county}} and the state of {{state}}";

var context = {
  city: "Abanda",
  county: "Chambers County",
  state: "Alabama"
};

var output = content.replace(/\{\{([a-z0-9]+)\}\}/gi, (match, key) => context[key]);

console.log(output);