You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建验证1-1816数字与范围输入的正则表达式技术问询

符合需求的正则表达式解决方案

没问题,我帮你打造一个精准符合需求的正则表达式!先明确你的核心规则:

  • 匹配单个数字:必须在1-1816之间,无前置零,不能是0或负数
  • 匹配范围:由短横线分隔的两个上述数字,每个数字都要符合单个数字的规则(如果需要强制范围的前数≤后数,正则本身很难处理,后面会说怎么用代码补充)

JavaScript 版本正则

// 基础匹配(不校验范围前后数字的大小顺序)
const numberRangeRegex = /^(?:[1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6])(?:-(?:[1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6]))?$/;

C# 版本正则

// 基础匹配(不校验范围前后数字的大小顺序)
var numberRangeRegex = new Regex(@"^(?:[1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6])(?:-(?:[1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6]))?$");

正则规则拆解

让我逐个部分解释,帮你理解为什么这么写:

  • ^ 和 $:锚定字符串的开头和结尾,确保我们匹配的是整个输入内容,避免部分匹配(比如"012"不会被误判)
  • 单个数字的匹配逻辑,拆分成多个子模式:
    • [1-9]:匹配1-9的单个数字,直接排除前导零和0
    • [1-9]\d:匹配10-99的数字,第一位非零,第二位任意数字
    • [1-9]\d{2}:匹配100-999的数字,同样保证第一位非零
    • 1[0-7]\d{2}:匹配1000-1799的数字,千位固定为1,百位0-7,后两位任意
    • 180\d:匹配1800-1809的数字
    • 181[0-6]:匹配1810-1816的数字,精准卡在你的上限1816
  • (?:-...):这是一个可选的非捕获组,用于匹配范围的短横线和第二个数字,确保输入可以是单个数字或范围

补充:校验范围的前后数字顺序

如果需要确保范围的第一个数字≤第二个数字(比如拒绝"1816-1815"这种反向范围),正则本身很难直接处理数字的大小比较,建议在正则匹配成功后用代码做二次校验:

JavaScript 校验函数

function isValidInput(input) {
  const regex = /^(?:([1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6]))(?:-([1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6]))?$/;
  const match = input.match(regex);
  if (!match) return false;
  
  // 如果是范围输入,判断前后数字大小
  if (match[2]) {
    const num1 = parseInt(match[1], 10);
    const num2 = parseInt(match[2], 10);
    return num1 <= num2;
  }
  return true;
}

C# 校验方法

public bool IsValidInput(string input)
{
    var regex = new Regex(@"^(?:([1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6]))(?:-([1-9]|[1-9]\d|[1-9]\d{2}|1[0-7]\d{2}|180\d|181[0-6]))?$");
    var match = regex.Match(input);
    if (!match.Success) return false;
    
    if (!string.IsNullOrEmpty(match.Groups[2].Value))
    {
        int num1 = int.Parse(match.Groups[1].Value);
        int num2 = int.Parse(match.Groups[2].Value);
        return num1 <= num2;
    }
    return true;
}

测试用例

有效输入

  • 单个数字:1、9、10、99、100、999、1000、1799、1800、1816
  • 范围:1-1816、3-100、1815-1816

无效输入

  • 0、-13、01(前导零)、1817(超出上限)、0-5(包含无效数字)、1816-1817(包含超出上限的数字)、1816-1815(反向范围,会被补充的代码校验拒绝)

内容的提问来源于stack exchange,提问作者user9812546

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:06:41