本文介绍如何准确验证形如 `a-b` 的字符串,要求 a 和 b 均为 1 到 45 的整数、且仅含一个连字符;推荐结合正则预检与数值逻辑校验的稳健方案,并提供可直接运行的 javascript 示例。
在表单输入或数据清洗场景中,常需限制用户输入为“两个 1–45 之间的整数,用且仅用一个短横线 - 连接”,例如 1-45、12-30 合法,而 1-、-25、5-60、1--30 或 1,25 均应拒绝。单纯依赖正则表达式虽可匹配基本格式,但无法原生校验数值范围(如 50-99 符合 \d+-\d+ 却超出 45 上限)。因此,最佳实践是采用「正则初筛 + 拆分后数值校验」两步法。
function isValidRange(input) {
// 第一步:用正则快速排除格式错误(仅数字+单连字符+非空)
if (!/^\d+-\d+$/.test(input)) return false;
// 第二步:拆分并转为数字,严格校验范围 [1, 45]
const [start, end] = input.split('-').map(Number);
// 检查是否为有效整数(排除 "01-05" 等含前导零的非法输入,因 Number() 会转换成功,但业务常要求无前导零)
if (!/^\d+-\d+$/.test(input) ||
start !== Math.floor(start) ||
end !== Math.floor(end) ||
start < 1 || start > 45 ||
end < 1 || end > 45) {
return false;
}
return true;
}
// 测试用例
console.log(isValidRange("1-45")); // true
console.log(isValidRange("12-45")); // true
console.log(isValidRange("2-10")); // true
console.log(isValidRange("1-")); // false(格式不全)
console.log(isValidRange("-2")); // false(缺左值)
console.log(isValidRange("1-45-")); // false(后缀非法)
console.log(isValidRange("50-55")); // false(超范围)
console.log(isValidRange("05-12")); // false(若需禁止前导零,此行将失败;如允许则删去前导零检查)
验证 a-b 格式的核心在于分离关注点:正则负责语法正确性(结构、字符集、连字符唯一性),JavaScript 数值运算负责语义正确性(范围、整数性、业务逻辑)。该模式清晰、健壮、易于测试与扩展,是生产环境中的首选方案。