通过使用捕获的匹配项作为键,用正则表达式替换字符串

时间:2018-08-05 13:10:35

标签: javascript regex string replace

假设我有这个字符串:

<i id="1"></i><i id="2"></i><i id="3"></i>

和该对象:

{
  "1": "Red",
  "2": "Green",
  "3": "Blue"
}

然后我要获取此字符串:

<i color="Red"></i><i color="Green"></i><i color="Blue"></i>

是否可以通过正则表达式替换?

我已经尝试过了:

var stringIwant = stringIhave.replace(/id="(\d)"/g, 'color="' + myObject["$1"] + '"')

但是它尝试读取该对象的属性“ $ 1”,该属性不存在。我也尝试删除$ 1周围的引号:

var stringIwant = stringIhave.replace(/id="(\d)"/g, 'color="' + myObject[$1] + '"')

但是我得到了ReferenceError: $1 is not defined

我已经尝试了更多的方法,但是没有什么值得一提的。

这就是为什么我想知道这是否有可能的原因。有帮助吗?

2 个答案:

答案 0 :(得分:4)

您可以通过回调来实现:

const stringIhave = `<i id="1"></i><i id="2"></i><i id="3"></i>`;

const obj = {
  "1": "Red",
  "2": "Green",
  "3": "Blue"
};

const stringIwant = stringIhave.replace(/id="(\d)"/g, (mat, grp) => `color="${obj[grp]}"`
);

console.log(stringIwant);

答案 1 :(得分:2)

您可以利用以下事实:可以将.replace()传递给函数作为第二个参数:

var stringIWant = stringIHave.replace(/id="(\d)"/g, function(wholeMatch, digits) {
  return "color='" + myObject[digits] + "'";
};

此类函数的第一个参数将是整个匹配项。第二个及后续参数将是您的正则表达式中的( )组(如果有)。返回的值将替换为整个匹配项。当正则表达式带有“ g”标志(如您的情况)时,该函数将在每次匹配迭代时调用。