Мне нужно регулярное выражение для соответствия следующему массиву чисел, которые могут быть вложены. Они должны пройти:
[]
[1, 2, 3]
[1, 2, 3, [1,2,3], 5]
но следующее должно не пройти тест:
abc
1
[1,2,3
[#]
Это работает:
/(^\[)(\d+\,|\s(?:(|\,))|\d+|\s\[|\]\,)*(\]$)/g
Есть ли лучший способ добиться того же результата. Я пробовал смотреть вперед, но не полностью понял это и не смог заставить его работать.
Нет, спасибо, что указали на это.
А как насчет [[[1]]]? Может ли быть более одного уровня вложенности?
@WiktorStribiżew, ваше решение блестяще. В основном я пытаюсь сделать то, что делает JSON.parse, поэтому вы дали мне отличную отправную точку.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Подход с регулярным выражением может быть следующим: удалить скобки из всех вложенных структур, а затем проверить, соответствует ли полученная строка шаблону [+число+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+ пробелов] - а ]$ - конец строки.Это правильный подход, который обрабатывает любой уровень рекурсии и проверяет любую строку [...], содержащую только фрагменты цифр, разделенных запятыми.
Это блестящий ответ, учитывая требование регулярного выражения. Я просто хочу добавить, что JSON.parse также может быть решением, особенно если требуется дальнейшая обработка обнаруженного массива.
Справедливости ради, требование состояло в том, чтобы иметь регулярное выражение, соответствующее указанным строкам. Этот ответ использует регулярное выражение, но не предоставляет такое регулярное выражение. Реальный ответ должен заключаться в том, что это невозможно с механизмом регулярных выражений JS, потому что он не поддерживает рекурсию.
@ndnenkov Это был бы комментарий, а не ответ. По крайней мере, это не добавило бы ценности SO. Всем известно, что Регулярное выражение JS не поддерживает рекурсию.
@WiktorStribiżew, очевидно, либо ОП не знает, либо она не знает, что необходимо создать такое регулярное выражение.
[1, 2, 3, [1,2,3]тоже проходит, бьюсь об заклад, это нежелательно?