Регулярное выражение: совпадение массива - PullRequest
0 голосов
/ 19 февраля 2019

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

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

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

abc 
1
[1,2,3
[#]

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

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

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

1 Ответ

0 голосов
/ 19 февраля 2019

Подход регулярного выражения может быть следующим: убрать скобки из всех вложенных структур, а затем проверить, соответствует ли полученная строка шаблону [ + число + 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 ]
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...