Я пытаюсь решить проблему замены строки; Функция, которая принимает строку и объект значений.
Это алгоритм из 2 частей:
Пример тестового случая:
expect(replaceValue('The sky is [condition] and the color is [[blue]]', {'condition':'clear')).toBe('The sky is clear and the color is [blue]');
Я решил первую часть:
function replaceValue(input, replacementValue){
let copied = input;
Object.keys(replacementValue).forEach(ele => {
copied = copied.replace(`[${ele}]`, replacementValue[ele]);
})
return copied;
}
Но я не уверен, как сделать вторую часть; снять внешние скобки.
Ах, извините, это должно было быть []
Вы можете искать квадратные скобки и заменять только известными свойствами или принимать возвращаемое значение.
/\[([^\[\]]+)\]/g complete regular experession
\[ \] outer brackets
( ) group for content
[^\[\]]+ inside all characters but not brackets
g search global
function replaceValue(string, replacements) {
return string.replace(/\[([^\[\]]+)\]/g, (_, s) => replacements[s] || s);
}
console.info(replaceValue('The sky is [condition] and the color is [[blue]]', { condition: 'clear' }));
Это работает :), но я не уверен, что делает регулярное выражение
Отрицательный просмотр назад помогает нам избежать замены ключевых слов, заключенных в двойные скобки ([[ и ]]):
function repl(str,obj) {
return str.replace(/(?<!\[)\[([^\]]+)\]/g, (_, s) => obj[s] || s);
}
console.info(repl('The sky is [condition] and the color is [[blue]]', { condition: 'clear' , blue:'#0000ff'}));
Объяснение:
Регулярное выражение (?<!\[)\[([^\]]+)\]/g состоит из
(?<!\[)
: отрицательный взгляд назад, требующий предыдущего символа, никогда не является [
\[
: сингл [
([^\]]+)
: группа, состоящая как минимум из одного не [
символа. Эта группа будет использоваться в функции обратного вызова метода .replace()
\]/g
: последний символ ]
и конец регулярного выражения с квалификатором g
для глобального, что позволяет многократно сопоставлять этот шаблон.В отличие от решения Нины, мое не заменит ключ [[blue]] в строке, хотя значение замены было бы доступно.
Используя отрицательный просмотр вперед, вы можете убедиться, что за одной скобкой не следует другая.
function replaceValue(input, replacementValue) {
return input
.replace(/\[(?!\[)([^\]]*?)\](?!\])/g, function(m, p) {
return replacementValue[p];
})
.replaceAll("[[", "[")
.replaceAll("]]", "]");
}
console.info(replaceValue('The sky is [condition] and the color is [[blue]]', {'condition':'clear'}));
Использовать регулярное выражение, совпадение начинается с двух открывающих скобок [[ и заканчивается двумя закрывающими скобками ]], заменяется строкой внутри скобок с одной парой скобок
function replaceValue(input, replacementValue) {
let copied = input;
Object.keys(replacementValue).forEach(ele => {
copied = copied.replace(`[${ele}]`, replacementValue[ele]);
});
copied = copied.replace(/\[\[(.*?)\]\]/g, '[$1]');
return copied;
}
Вы можете заменить {{ }} на [[ ]], затем выполните свои замены, затем замените [[ на { и т. д.