Показать сообщение отдельно
  #1 (permalink)  
Старый 18.01.2015, 17:34
Интересующийся
Отправить личное сообщение для y0uix Посмотреть профиль Найти все сообщения от y0uix
 
Регистрация: 22.10.2013
Сообщений: 11

Рекурсивная валидация
Здравствуйте!

Стоит задача валидировать вложенные скобки (({[) произвольной глубины вложенности. Причем может быть и так ({})[({})], это также валидный формат.

Написал:
function validBraces(braces) {
  if (braces.length % 2 !== 0) {
    return false;
  }
  
  var assoc = {
    '(': ')',
    '{': '}',
    '[': ']'
  };

  for (var i = 0, m; i < Math.round(braces.length / 2); i += 1) {
    if (!~Object.keys(assoc).indexOf(braces[i])) continue;
    m = braces.match(RegExp('\\' + braces[i] + '(' + (braces[i] === braces[i + 1] ? '.' : '[^\\' + assoc[braces[i]] + ']') + '*)\\' + assoc[braces[i]]));
    if (m === null || m[1].length % 2 !== 0) return false;
  }
  return true;
}

Он корректно мэтчит ({})[({})], но некорректно (({{[[]]}})), причем во многих других случаях также корректно отрабатывает.

Подскажите пожалуйста, где я не прав и как бы вы реализовали задачу? Спасибо.
Ответить с цитированием