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

如何让在线工具中可用的时间间隔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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:51:16