首页 > 解决方案 > 验证打印正则表达式的页面范围

问题描述

我需要验证页面范围的正则表达式。(例如,打印自定义页面)

目前,我已经尝试过这个表达

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

它应该接受像

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

它不应该接受像

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

标签: javascriptregex

解决方案


那时,我不会为新手难以阅读的正则表达式而烦恼。使用纯 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"))

在线尝试!


推荐阅读