проверить диапазоны страниц для печати регулярных выражений - PullRequest
1 голос
/ 08 ноября 2019

Мне нужно регулярное выражение, которое проверяет диапазоны страниц. (Например, печать пользовательских страниц)

В настоящее время я пробовал это выражение

/^(?!([ \d]*-){2})\d+(?: *[-,] *\d+)*$/

Он должен принимать такие значения, как

 1, 3, 6-9
 1-5, 5
 6, 9

Он не должен принимать такие значения, как

 ,5
 5-,9
 9-5,
 2,6-
 10-1

1 Ответ

3 голосов
/ 08 ноября 2019

В этот момент я не буду беспокоиться о регулярном выражении, которое трудно прочитать неофиту. Безрегулярное, но подробное решение с чистым js:

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

Демо:

const isNumeric = input => !isNaN(input) // you may also check if the value is a nonzero positive integer
const isOrdered = (start, end) => parseInt(start) < parseInt(end)
const isRangeValid = range => range.length == 2 && range.every(isNumeric) && isOrdered(range[0], range[1])
const isSingleValid = single => single.length == 1 && isNumeric(single[0])

function f(input) {
    const inputs = input.split(',').map(x => x.trim());

    for (const x of inputs) {
        if (!x) return false;
        const pages = x.split('-');
        if (!isSingleValid(pages) && !isRangeValid(pages))
            return false;
    }

    return true;
}

console.log(f("1, 3, 6-9"))
console.log(f("1-5, 5"))
console.log(f("6, 9"))

console.log(f(",5"))
console.log(f("5-,9"))
console.log(f("9-5,"))
console.log(f("2,6-"))
console.log(f("10-1"))
console.log(f("56-0"))

Попробуйте онлайн!

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