Подход регулярного выражения может быть следующим: убрать скобки из всех вложенных структур, а затем проверить, соответствует ли полученная строка шаблону [
+ число + 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.log(test_string);
while (rx.test(test_string)) {
test_string = test_string.replace(rx, "$1")
}
console.log(valid_rx.test(test_string));
}
Первое регулярное выражение /(?!^)\[([^\][]*)]/
находит [...]
подстрок, которые не находятся в начальной позиции строки.Между [
и ]
не может быть ни [
, ни ]
.Цикл while
удаляет эти скобки по одному до тех пор, пока не будет найдено совпадение.
Второе регулярное выражение ^\[(?:\s*\d+(?:\s*,\s*\d+)*)?\s*]$
проверяет полученную строку:
^
- начало строки \[
- [
(?:
- группа без захвата: \s*
- 0+ пробелов \d+
- 1+ цифр (?:\s*,\s*\d+)*
- 0 или более повторений ,
, заключенных в 0+ пробелов, 1+ цифр
)?
-конец необязательной группы \s*
- 0+ пробелов ]
- a ]
$
- конец строки.