Манипулирование строк через рекурсию (JS) - PullRequest
1 голос
/ 12 марта 2020

У меня есть входящие строки, которые отформатированы с использованием метода скобок, который я раньше не видел (я предполагаю сжать размер). Понять сам метод просто, но у меня возникают проблемы с его преобразованием в код.


Вот простой пример входящей строки: 'ADFAS[AA,BT]'

Эта строка требует быть проанализированным так, чтобы это привело к массиву: ['ADFASAA', 'ADFASBT'].

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


Вот более сложный пример: 'INGFKQRRG[I5EEOR[T,U,V,W],Y5ECOR[T,U]]'

, который должен дать результат:

[
  'INGFKQRRGI5EEORT', //--
  'INGFKQRRGI5EEORU', //  \
  'INGFKQRRGI5EEORV', //  / - these are from the first nested level block and its nested letter endings
  'INGFKQRRGI5EEORW', //--

  'INGFKQRRGY5ECORT', //--\
  'INGFKQRRGY5ECORU', //--/ - these are from the second nested level block and its nested letter endings
]

Входящие строки могут иметь несколько вложенных уровней. Пример: 'GMZTAOSIHI[2Q,3[A,Q],4A]' Что должно дать:

[
  'GMZTAOSIHI2Q',

  'GMZTAOSIHI3A',
  'GMZTAOSIHI3Q',

  'GMZTAOSIHI4A'
]

Вот такой подход, который я использовал до сих пор:

Функция, которая находит наиболее удаленный в скобках substr

function getInnerBracket(s) {
    const sBracket = s.indexOf('['),
          eBracket = s.lastIndexOf(']');

    return t.slice(sBracket + 1, eBracket);
}

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

function testForSubItems(s) {
    return /\],/.test(s)
        ? s.split('],')
        : s;
}

В в этот момент я чувствую себя очень застрявшим, потому что не могу понять, как написать одну функцию-обертку, чтобы рекурсивно отслеживать, когда передать ее обратно этим двум вспомогательным функциям. Каждая попытка заканчивается логи c дырками, и я застреваю.

1 Ответ

4 голосов
/ 12 марта 2020

Рекурсивное regex решение:

let A = 'INGFKQRRG[I5EEOR[T,U,V,W],Y5ECOR[T,U]]';

const expand = (s) => {
  s = s.replace(
    /([^[,]+)\[([^[\]]+)\]/g, 
    (_, w, px) => px.split(',').map(c => w+c).join(',')
  );
  return s.includes('[') ? expand(s) : s.split(',');
}

console.log(expand(A))
console.log(expand('GMZTAOSIHI[2Q,3[A,Q],4A]'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...