У меня есть строка с несколькими вхождениями такого ключа
var str = '[a] is a string with many [a] but only one [b]';
теперь у меня есть объект с ключами со значениями в str;
var obj = {a:'the a',b:'the b'};
Я пробовал это, заменяя эти ключи своими значениями
let output = str;
for (const key in obj) {
output = output.replace(new RegExp('[[' + key + ']]', 'g'), obj[key]);
}
его выход
[the a is a string with many [the a but only one [the b
может ли любое тело сказать, чего я не хватает?
редактировать
Как заменить @[a](a)
the a
и @[b](b)
the b
? т.е.
var str = '@[a](a) is a string with many @[a](a) but only one @[b](b)';
Вы должны использовать этот код:
var str = '@[a](a) is a string with many @[a](a) but only one @[b](b)';
var obj = {a:'the a',b:'the b'};
let output = str;
for (const key in obj) {
output = output.replace(new RegExp('@\\[' + key + '\\]\\(' + key + '\\)', 'g'), obj[key]);
}
console.log(output);
//=> "the a is a string with many the a but only one the b"
[
должен быть экранирован в регулярном выражении Javascript, и при использовании конструктора RegExp
дважды RegExp
его.
Пример [[a]]
соответствует либо []
либо a]
потому что он анализирует
[[a] # Class, '[' or 'a'
] # followed by ']'
Чтобы исправить это, избегайте литералов внешней скобки, чтобы они были литералами.
output = output.replace(new RegExp('\\[[' + key + ']\\]', 'g'), obj[key]);
и вы даже можете избавиться от внутренних кластеров классов, так как есть только 1 ключ каждый проход.
output = output.replace(new RegExp('\\[' + key + '\\]', 'g'), obj[key]);