Регулярное выражение: соответствие массиву

Мне нужно регулярное выражение для соответствия следующему массиву чисел, которые могут быть вложены. Они должны пройти:

[]
[1, 2, 3]
[1, 2, 3, [1,2,3], 5]

но следующее должно не пройти тест:

abc 
1
[1,2,3
[#]

Это работает:

/(^\[)(\d+\,|\s(?:(|\,))|\d+|\s\[|\]\,)*(\]$)/g

Есть ли лучший способ добиться того же результата. Я пробовал смотреть вперед, но не полностью понял это и не смог заставить его работать.

[1, 2, 3, [1,2,3] тоже проходит, бьюсь об заклад, это нежелательно?
CertainPerformance 19.02.2019 10:31

Нет, спасибо, что указали на это.

Valerie 19.02.2019 10:34

А как насчет [[[1]]]? Может ли быть более одного уровня вложенности?

ndnenkov 19.02.2019 10:35

См. демо на regex101.com для двигателя PCRE.

Jan 19.02.2019 10:42

@WiktorStribiżew, ваше решение блестяще. В основном я пытаюсь сделать то, что делает JSON.parse, поэтому вы дали мне отличную отправную точку.

Valerie 21.02.2019 10:20
Поведение ключевого слова "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
5
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подход с регулярным выражением может быть следующим: удалить скобки из всех вложенных структур, а затем проверить, соответствует ли полученная строка шаблону [+число+1 или более повторению шаблона , + числа+]:

var s = ['[]', '[1, 2, 3]', '[1, 2, 3, [1,2,3], 5]', '1', '[1,2,3', '[#]'];
var rx = /(?!^)\[([^\][]*)]/;
var valid_rx = /^\[(?:\s*\d+(?:\s*,\s*\d+)*)?\s*]$/;
for (var i=0; i<s.length; i++) {
  var test_string = s[i];
  console.info(test_string);
  while (rx.test(test_string)) {
    test_string = test_string.replace(rx, "$1")
  }
  console.info(valid_rx.test(test_string));
}

Первое регулярное выражение, /(?!^)\[([^\][]*)]/, находит [...] подстрок, которые не находятся в начальной позиции строки. Между [ и ] не может быть ни [, ни ]. Цикл while удаляет эти скобки одну за другой до тех пор, пока не будет найдено совпадение.

Второе регулярное выражение, ^\[(?:\s*\d+(?:\s*,\s*\d+)*)?\s*]$, проверяет результирующую строку:

  • ^ - начало строки
  • \[ - а [
  • (?: - незахватывающая группа:
    • \s* - 0+ пробелов
    • \d+ - 1+ цифры
    • (?:\s*,\s*\d+)* - 0 или более повторений ,, заключенных в 0+ пробелов, 1+ цифр
  • )? - конец необязательной группы
  • \s* - 0+ пробелов
  • ] - а ]
  • $ - конец строки.

Это правильный подход, который обрабатывает любой уровень рекурсии и проверяет любую строку [...], содержащую только фрагменты цифр, разделенных запятыми.

Wiktor Stribiżew 19.02.2019 10:43

Это блестящий ответ, учитывая требование регулярного выражения. Я просто хочу добавить, что JSON.parse также может быть решением, особенно если требуется дальнейшая обработка обнаруженного массива.

Rikonator 19.02.2019 10:55

Справедливости ради, требование состояло в том, чтобы иметь регулярное выражение, соответствующее указанным строкам. Этот ответ использует регулярное выражение, но не предоставляет такое регулярное выражение. Реальный ответ должен заключаться в том, что это невозможно с механизмом регулярных выражений JS, потому что он не поддерживает рекурсию.

ndnenkov 19.02.2019 13:37

@ndnenkov Это был бы комментарий, а не ответ. По крайней мере, это не добавило бы ценности SO. Всем известно, что Регулярное выражение JS не поддерживает рекурсию.

Wiktor Stribiżew 19.02.2019 13:38

@WiktorStribiżew, очевидно, либо ОП не знает, либо она не знает, что необходимо создать такое регулярное выражение.

ndnenkov 19.02.2019 14:14

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