假设我有这个字符串:
<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
我已经尝试了更多的方法,但是没有什么值得一提的。
这就是为什么我想知道这是否有可能的原因。有帮助吗?
答案 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”标志(如您的情况)时,该函数将在每次匹配迭代时调用。