月份输入规则的正则验证与重复值校验规则合并方案咨询
解决月份输入的格式+去重正则合并问题
嘿,我来帮你搞定这个正则合并的问题!你的需求是既要保证输入是合法的单个/多个月份(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-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-12的合法值,同时避免出现末尾带逗号、连续逗号这类格式错误。
- 全选星号匹配:简化了原规则为
^\*$,如果你的业务确实需要允许多个星号,改回^\*+$即可。
额外说明
这个正则会自动拦截所有非法输入:
- 重复月份,比如
1,2,1 - 超出1-12范围的数字,比如
0或13 - 格式错误的输入,比如
1,,2或1-2
内容的提问来源于stack exchange,提问作者KsL
相关产品推荐
相关产品推荐

