замена подстрок строки с помощью регулярного выражения javascript

дана строка:

let str =
'{{ name }} is here. {{ name }} is playing {{ game }}. he is {{ age }}'

объект:

const obj = { name: 'Petro', game: 'Mortal Comabt', age: 27 }

В строке необходимо шаблоны, совпадающие с ключами объекта, заменить с помощью регулярного выражения.

Мое решение:

const arr = Object.keys(obj)
arr.forEach((item) => {
  str = str.replace(new RegExp(`({{ ${item} }})`, 'g'), `${obj[item]}`)
})

console.log(str)

Возможно ли решение без перебора массива (forEach)?

есть ощущение что решение близко:

console.log(str.replace(new RegExp('({{ (\\w+) }})', 'g'), 'obj.$2'))

Ответы (2 шт):

Автор решения: Sanya H
let str =
'{{ name }} is here. {{ name }} is playing {{ game }}. he is {{ age }}'
const obj = { name: 'Petro', game: 'Mortal Comabt', age: 27 }    

str = str.replace(new RegExp(`{{ (\\w+) }}`, 'g'), (_, val) => obj[val] || _)
console.log(str)
→ Ссылка
Автор решения: Wiktor Stribiżew

Вы можете использовать

/{{\s+(\w+)\s+}}/g

Подробности

  • {{ - строка {{
  • \s+ - один и более проебельных символов
  • (\w+) - Захватывающая подмаска №1: одна и более букв, цифр или знаков подчёркивания
  • \s+ - один и более проебельных символов
  • }} - строка }}.

let str = '{{ name }} is here. {{ name }} is playing {{ game }}. he is {{ age }}. Note: {{ word }} is an unknown placeholder.';
const obj = { name: 'Petro', game: 'Mortal Comabt', age: 27 }
console.log(
    str.replace(/{{\s+(\w+)\s+}}/g, (match, group) => obj[group] || match)
)

Обратите внимание, с помощью флага g осуществляется поиск всех совпадений в строке. В качестве замены используется (match, group) => obj[group] || match), где match — текст целого совпадения, а group — текст захватывающей подмаски №1. Если подмаска "сработала", нашла совпадение, то возвращается соответствующее значение obj, иначе возвращается текст целого совпадения.

→ Ссылка