我有一个如下所示的字符串
givenText = "#0How #0much #0sales #0in #0batu #0where #0discount #0on #0sales?"
我有一本如下所示的字典
termAssignment = {"sales": "#4", "batu": "#2"}
现在我想替换字符串中与字典键匹配的术语。但正如您所看到的,字符串中与键匹配的两个术语是 sales
和 batu
。但我还想替换与这些术语关联的 #n
。
所以基本上最终结果应该是
"#0How #0much #4sales #0in #2batu #0where #0discount #0on #4sales?"
所以如果我做这样的事情
for(word in termAssignment) {
if(givenText.includes(word)) {
replaceTerm = "#0" + word
givenText = givenText.replace(/replaceTerm/g, termAssignment[word] + word)
}
}
但它没有做任何事情,因为我需要在字符串上应用global
替换,并且我将该字符串分配给了一个变量。
如何将正则表达式与变量关联并进行替换?
最佳答案
您可以通过|
连接键,传递给new RegExp
,其中#\d+
位于左侧,然后使用替换函数。确保#n
之后的部分位于前瞻和捕获组中,然后在对象上查找匹配的捕获组(键)的值,并替换为该值:
const givenText = "#0How #0much #0sales #0in #0batu #0where #0discount #0on #0sales?";
const termAssignment = {"sales": "#4", "batu": "#2"};
const pattern = new RegExp(
`#\\d+(?=(${Object.keys(termAssignment).join('|')}))`,
'g'
);
const result = givenText.replace(pattern, (_, key) => termAssignment[key]);
console.log(result);
对于这种情况,生成的模式将是:
#\d+(?=(sales|batu))
它匹配 #
,后跟一个或多个数字,然后捕获后面的单词以用于替换。在替换函数中,不使用整个匹配项,例如 _
变量中的 #0
,但第二个参数是第一个捕获组中包含的内容,因此它将是sales
或batu
。因此,您需要做的就是查找对象的属性并返回它,以便将 #n
部分替换为适当的数字。
关于javascript - 如何使用正则表达式进行多重替换,其中要替换的术语存储在变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60351706/