替换多个包含$符号的字符串

时间:2019-01-31 13:03:23

标签: javascript regex replace

我在使用正则表达式和字符串替换时遇到了问题,我希望获得一点帮助。

我有一个具有以下格式的字符串

var occ_twentyfive = [1,2,3];

我需要用我的字符串替换所有$(唯一结果)。

我尝试了以下代码,但是我似乎无法找出为什么这行不通

<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>

结果与我输入的字符串完全相同。

有人可以帮我,但也指出为什么它不起作用吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

您错过了转义。您需要正确逃脱

let str = `<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>`

let op = str.replace(new RegExp('\\$\\(unique-result\\)','g'), 'Changed')

console.log(op)

在的情况下,我不使用任何变量i喜欢使用regex literal (//)

let str = `<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>`

let op = str.replace(/\$\(unique-result\)/g, 'Changed')

console.log(op)

答案 1 :(得分:2)

还有更通用的解决方案。

首先,正如我在评论中提到的那样,您不需要使用RegExp构造函数,只需在斜杠之间传递正则表达式,并在最后一个斜杠后使用标志即可。

str.replace(/\$\(unique-result\)/g, "someValue")

第二个时刻是String.prototype.replace可以接受函数作为第二个参数。当您的字符串中有很多命名模板时,这将很有帮助。例如,您有下一个传入的字符串:

var incomingString = "$(first-value) says $(second-value) when there is $(third-value)"

使用您提供的代码,您应该调用replace 3次。但是,如果您将函数用作第二个参数,则可以简化为:

var incomingString = "$(first-value) says $(second-value) when there is $(third-value)"
var data = {
  "first-value": "Kappa",
  "second-value": "Hey!",
  "third-value": "GreyFaceNoSpace"
}
var resultString = incomingString.replace(/\$\(([^)]+)\)/g, (match, capture) => {
  console.log(match, capture)
  return data[capture]
})
console.log(resultString)

“这是怎么回事?!”你可能会问。没什么复杂的。

  1. 作为参数传递的函数接受一个或多个参数:第一个是完全匹配,其他则是捕获的组。它应返回字符串,该字符串应替换完全匹配
  2. 在我们的正则表达式中,我们描述了我们想匹配格式为\$\(([^)]+)\)的所有可能的子字符串,其中[^)]+指的是一个或多个任何符号-除外-一个封闭的括号,并且应该捕获此构造(在未经过消毒的括号之间)。

因此,一旦此正则表达式匹配,它将把整个$(...)结构传递到传递函数的match参数中,并将模板的名称传递给capture参数中。因此capture是我们进行某些数据存储的关键,我们只是在函数中返回该值。

就是这样!希望这会有所帮助:)

答案 2 :(得分:0)

您可以使用一个简单的函数进行替换。匹配每个$(string)并应用函数以将其替换为存储在对象中的变量。容易且可扩展。

const tpl = '<div class="$(unique-result) single-result data-index=$(i)"><div class="airport-data data-index=$(i)">$(name)<br>$(city) ,$(country)</div><div class="airport-code data-index=$(i)">$(IATA)</div></div>';

const vars = {
  i : 9,
  'unique-result' : 'uniq',
  country : 'gb',
  city : 'Manchester',
  IATA : 'MCH'
};

const replaceVars = (tpl,vars) => {
  const replacer = (m, m1) =>
      typeof vars[m1] != 'undefined' ? vars[m1] : '';
  return tpl.replace(/\$\(([\w-]+)\)/g, replacer);
};

console.log(replaceVars(tpl,vars));