如何让在线工具中可用的时间间隔RegExp在JavaScript中生效?
解决JavaScript中时间间隔正则匹配失败的问题
你的正则匹配失败主要有几个关键问题,修正后即可正常运行:
错误点分析
- 未正确匹配数字:原正则中的
d+会匹配字母d的连续出现,而非数字,应该改为\d+。 - 错误混用正则构造方式:同时使用
new RegExp()和正则字面量/.../属于冗余写法,直接用正则字面量可避免转义混乱。 - 全局标志
g导致匹配异常:g标志会让test()方法保留上次匹配的位置,多次调用时出现非预期结果,单个字符串验证不需要该标志。
修正后的代码
function isInterval(value) { // 修正正则:正确匹配数字、移除冗余构造、去掉全局标志 const regex = /^(?!.*(second|minute|hour|day|week|month|year).*\1)\d+\s+(?:second|minute|hour|day|week|month|year)\s?(?: +\d+\s+(?:second|minute|hour|day|week|month|year)\s?)*$/i; const matches = value.match(regex); const isValid = regex.test(value); console.log(`MATCH ${value} MATCH ${matches} TEST ${isValid}`); return isValid; } const interval = "1 year 6 months 10 days 12 hours 30 minutes 30 seconds"; console.log(isInterval(interval)); // 输出 true
正则说明
^(?!.*(second|minute|hour|day|week|month|year).*\1):负向预查,确保同一个时间单位不会重复出现(比如不会匹配1 year 2 year)。\d+\s+(?:second|minute|hour|day|week|month|year):匹配单个时间项(如1 year、6 months)。(?: +\d+\s+(?:second|minute|hour|day|week|month|year)\s?)*:允许添加多个时间项,项之间用空格分隔。i标志:忽略大小写,支持匹配Year、MONTH等大小写变体。
内容的提问来源于stack exchange,提问作者jmc42
相关产品推荐
相关产品推荐

