我在使用正则表达式和字符串替换时遇到了问题,我希望获得一点帮助。
我有一个具有以下格式的字符串
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>
结果与我输入的字符串完全相同。
有人可以帮我,但也指出为什么它不起作用吗?
谢谢。
答案 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)
“这是怎么回事?!”你可能会问。没什么复杂的。
\$\(([^)]+)\)
的所有可能的子字符串,其中[^)]+
指的是一个或多个任何符号-除外-一个封闭的括号,并且应该捕获此构造(在未经过消毒的括号之间)。因此,一旦此正则表达式匹配,它将把整个$(...)
结构传递到传递函数的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));