замена подстрок строки с помощью регулярного выражения 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, иначе возвращается текст целого совпадения.