javascript - 如何使用正则表达式进行多重替换,其中要替换的术语存储在变量中?

标签 javascript regex

我有一个如下所示的字符串

givenText = "#0How #0much #0sales #0in #0batu #0where #0discount #0on #0sales?"

我有一本如下所示的字典

termAssignment = {"sales": "#4", "batu": "#2"}

现在我想替换字符串中与字典键匹配的术语。但正如您所看到的,字符串中与键匹配的两个术语是 salesbatu。但我还想替换与这些术语关联的 #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,但第二个参数是第一个捕获组中包含的内容,因此它将是salesbatu。因此,您需要做的就是查找对象的属性并返回它,以便将 #n 部分替换为适当的数字。

关于javascript - 如何使用正则表达式进行多重替换,其中要替换的术语存储在变量中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60351706/

相关文章:

javascript - 从 props 访问过滤后的对象值 (JS/React)

javascript - 用于分隔子集的正则表达式和嵌套方括号

javascript - JS RegExp 中的转义特殊字符(在 jQuery .each() 中使用)

javascript - 如何捕获由特定单词分隔的字符串的不同 x 部分

JavaScript Regex 在两个词之间选择一个词

javascript - JSON.stringify 忽略对象属性

javascript - 无法在 JavaScript 中同时捕获按键和按键事件

javascript - 设置/获取文本节点值的方法

php - 将字符串与数组匹配的正则表达式

java - 正则表达式仅匹配字符串中的一个字符序列