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

月份输入规则的正则验证与重复值校验规则合并方案咨询

解决月份输入的格式+去重正则合并问题

嘿,我来帮你搞定这个正则合并的问题!你的需求是既要保证输入是合法的单个/多个月份(1-12)或全选星号,又要确保多个月份时没有重复值对吧?

首先拆解下你原有的正则逻辑:

  • 匹配单个合法月份:^([1-9]|1[0-2])$
  • 匹配多个用逗号分隔的合法月份:^(([1-9]|1[0-2])+(,[1-9]|,1[0-2])*)?$
  • 匹配全选的星号:^[*]*$

但原正则的多月份部分没做去重校验,而你单独用/\b(\d+)\b.*?,\1\b/检测重复,现在我们可以把这个去重逻辑直接整合到主正则里,用正向否定预查实现。

合并后的最终正则

直接替换你input的pattern属性为下面这段代码即可:

<input cdkTrapFocus [cdkTrapFocusAutoCapture]="true" type="address" matInput [(ngModel)]="Time.month" name="month" #month=ngModel pattern="^([1-9]|1[0-2])$|^((?!.*\b(\d+)\b.*,\1\b)([1-9]|1[0-2])(?:,(?=[1-9]|1[0-2]))(?:[1-9]|1[0-2]))*$|^\*$">

正则核心逻辑详解

我把关键部分拆解开给你理清楚:

  1. 单个月份匹配:保留原有规则^([1-9]|1[0-2])$,无改动。
  2. 多去重月份匹配:
    • (?!.*\b(\d+)\b.*,\1\b):这是核心的去重校验,意思是"整个字符串中不能存在任何一个数字,后面跟着逗号再出现相同的数字",直接把重复值校验嵌进了主规则。
    • ([1-9]|1[0-2])(?:,(?=[1-9]|1[0-2]))(?:[1-9]|1[0-2])*:确保每个月份都是1-12的合法值,同时避免出现末尾带逗号、连续逗号这类格式错误。
  3. 全选星号匹配:简化了原规则为^\*$,如果你的业务确实需要允许多个星号,改回^\*+$即可。

额外说明

这个正则会自动拦截所有非法输入:

  • 重复月份,比如1,2,1
  • 超出1-12范围的数字,比如0或13
  • 格式错误的输入,比如1,,2或1-2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:53:07