Регулярное выражение для диапазона чисел, разделенных запятыми N раз - PullRequest
2 голосов
/ 29 сентября 2019

У меня есть это регулярное выражение для проверки ввода VLAN между 1 and 4096, числа должны быть разделены запятыми, но я не знаю, как заставить регулярное выражение отклонять повторяющиеся запятые и заканчиваться запятой.

Iнужно это:

1234,234,4096 (no repeating commas, no spaces, no commas at the end)

прямо сейчас мое регулярное выражение также позволяет это:

1234,,234,4096,

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

^(?:[1-9]\d{0,2}|[1-3]\d{3}|40(?:[0-8]\d|9[0-6]))(?:[,]+(?:[1-9]\d{0,2}|[1-3]\d{3}|40(?:[0-8]\d|9[0-6]))?)*$

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Я голосую за , а не , используя здесь регулярное выражение, вместо этого разделяя строку запятой и проверяя каждый элемент:

var input = "1234,234,4096";
var parts = input.split(",");
var success = true;
for (var i=0; i < parts.length; i++) {
    if (isNaN(parts[i]) || parts[i] < 1 || parts[i] > 4096) {
        success = false;
        break;
    }
}

if (success) {
    console.log("CSV string is valid.");
}
else {
    console.log("CSV string is invalid");
}
1 голос
/ 29 сентября 2019

В вашем регулярном выражении есть две проблемы

[,]+(?:[1-9]\d{0,2}|[1-3]\d{3}|40(?:[0-8]\d|9[0-6]))?
  • [,]+ - это позволит более чем 1 , соответствовать
  • (?:[1-9]\d{0,2}|[1-3]\d{3}|40(?:[0-8]\d|9[0-6]))? - так как этонеобязательно, поэтому ,, будет соответствовать

. Вы можете использовать этот шаблон

^(?:(?:\d{1,3}|[0-3]\d{3}|40[0-8]\d|409[0-6]),)*?(?:(?:\d{1,3}|[0-3]\d{3}|40[0-8]\d|409[0-6]))$

enter image description here

Так что вв этом регулярном выражении идея состоит в том, что номер совпадения следует за нулем или более раз (сделайте это ленивым, чтобы последняя группа, в которой мы сопоставляем число без запятой), за которой следует число без запятой

Regex demo

const regex = /^(?:(?:\d{1,3}|[0-3]\d{3}|40[0-8]\d|409[0-6]),)*?(?:(?:\d{1,3}|[0-3]\d{3}|40[0-8]\d|409[0-6]))$/;
const strs = ['1234,234,4096', '1234,,234,4096,', '1234', '1234,', '4097', '4096']

strs.forEach(str => {
  console.log(str, '\t\t\t', regex.test(str))
})

Редактировать: - хотя я забыл упомянуть, что он не может разрешить нули в начале.

^(?:(?:[1-9]\d{0,2}|[1-3]\d{3}|40[0-8]\d|409[0-6]),)*?(?:(?:[1-9]\d{0,2}|[1-3]\d{3}|40[0-8]\d|409[0-6]))$

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...