Преобразование строки «3 [d2 [e]]» в «deedeedee»

У меня небольшая проблема. Я работаю над простой программой обработки строк на JavaScript.

Когда вы входите:

"2[a]3[bc]"

Он вернется:

"aabcbcbc"

"3[d2[e]]" > "deedeedee", 
"fg2[eset]3[hi]" > " fgesetesethihihi"

Мой код выглядит так:

document.getElementById("myText").value = "String...";

function myFunction() {
  var str = document.getElementById("myText").value;
  var arr = [];

  for (var i = 0; i < str.length; i++) {
    var element = str[i]
    if (isNaN(element) === false) {
      arr += ".repeat(" + element + ")";
    } else if (element == "[" || element == "]") {
      arr += "'"
    } else {
      arr += element;
    }

  }
  document.getElementById("answer").value = arr;
}

Ты хоть представляешь, как это исправить?

Теперь он возвращается: .repeat(2)'a'.repeat(3)'bc'

Описанный вами язык сжатия - это контекстно-свободный язык (или, более конкретно, это контекстно-свободный язык, который не является обычный язык). Невозможно проанализировать такой язык без сохранения дополнительной информации, такой как количество видимых открывающих и закрывающих скобок. Я бы посоветовал отложить компьютер, подумать о проблеме, сделать несколько заметок и только потом вернуться к коду.

user234461 07.06.2018 13:44

Извините, но меня удивляет, как и почему вы думаете, что добавление строки ".repeat(" к вашему тексту действительно поможет в достижении желаемого результата.

Peter B 07.06.2018 13:47

Он нашел где-то код, который использует eval, но не понял, как он работает, поэтому не смог его правильно скопировать.

Sean F 07.06.2018 14:04

@AntoniBrulinski примите мой ответ как правильный, если он вам подходит

Canta 21.09.2018 15:22
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
81
2

Ответы 2

Предполагая, что ввод всегда правильный, вы можете использовать регулярное выражение для получения содержимого inner [], а также количества повторений слева. Сначала мы решаем только самый intern [] и продолжаем делать это до тех пор, пока не закончится [] в исходной строке.

function parseFunction(input) {
  while(input.includes("[")) {
    input = input.replace(/\d+\[[A-Za-z]+\]/g, function(s) {
      s = s.replace("]","").split("[");
      var newS = "";
      for(var i = 0; i < parseInt(s[0]); i++)
        newS += s[1];	
      return newS;
    });
  }
  return input;
}

console.info(parseFunction("2[a]3[bc]"));
console.info(parseFunction("3[d2[e]]"));
console.info(parseFunction("fg2[eset]3[hi]"));

Отказ от ответственности: это решение не позволит интерпретировать "3[d2[e]]".

Этого можно добиться с использованием методов объекта Array. Я предоставил пошаговое руководство, как заставить его работать. Также, подробный пример, использующий "2[a]3[bc]" в качестве начальной строки.

  1. разделите массив на ] (используйте метод .split в вашей переменной String)

    [
      "2[a",
      "3[bc",
      ""
    ]
    
  2. сопоставьте каждый элемент с массивом, содержащим как счетчик, так и строку, используйте .map:

    [
      [
        "2",
        "a"
      ],
      [
        "3",
        "bc"
      ],
      [
        ""
      ]
    ]
    
  3. удалите последний массив, так как он не содержит никакой информации, используйте slice(0, -1):

    [
      [
        "2",
        "a"
      ],
      [
        "3",
        "bc"
      ]
    ]
    
  4. теперь пришло время объединить счетчик и строку для каждого массива, мы делаем это, используя еще одну карту и применяя метод String.repeat. Таким образом, функция, применяемая к каждому элементу (помните, что здесь элементы относятся к типу Array!), Будет выглядеть примерно так: w => w[1].repeat(w[0].match(/\d+/)[0]) ...

    w[0].match(/\d+/)[0] позволит выбрать целое число из строки:

    [
      "aa",
      "bcbcbc"
    ]
    
  5. наконец, мы объединим каждую строку, чтобы получить результат, используя join(''):

    aabcbcbc
    

Попробуйте заставить его работать по приведенной выше инструкции. Решение ниже ...

const convert = (array) => 
  array.split(']')
    .map(e => e.split('['))
    .slice(0, -1)
    .map(w => w[1].repeat(w[0].match(/\d+/)[0]))
    .join('')

console.info(convert("2[a]4[bc]"))
console.info(convert("2A[c]e4c[Abc]"))

Я внес изменения, чтобы позволить "2[a]3bb[bc]" работать.

Ivan 07.06.2018 14:25

Это не работает, если первым символом является нечисловой, например, в OPs fg2[eset]3[hi], ни для вложенного, 3[d2[e]].

James Thorpe 07.06.2018 14:28

Правда, я не понимал, что OP этого хотел.

Ivan 07.06.2018 14:33

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