Как убрать скобки из строки?

Я пытаюсь решить проблему замены строки; Функция, которая принимает строку и объект значений.

Это алгоритм из 2 частей:

  1. Замените значения в строке, которые находятся внутри фигурных скобок.
  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;
}

Но я не уверен, как сделать вторую часть; снять внешние скобки.

Вы можете заменить {{ }} на [[ ]], затем выполните свои замены, затем замените [[ на { и т. д.

IT goldman 11.02.2023 11:41

Ах, извините, это должно было быть []

webber 11.02.2023 11:50
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
1
2
112
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете искать квадратные скобки и заменять только известными свойствами или принимать возвращаемое значение.

/\[([^\[\]]+)\]/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' }));

Это работает :), но я не уверен, что делает регулярное выражение

webber 11.02.2023 12:00
Ответ принят как подходящий

Отрицательный просмотр назад помогает нам избежать замены ключевых слов, заключенных в двойные скобки ([[ и ]]):

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;
}

Другие вопросы по теме