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

JavaScript中yyyy-mm-dd日期正则匹配返回null问题求助

问题解决:日期正则匹配返回null的原因及修正方案

核心问题

你的正则表达式不支持一位数字的日期(如2022-10-1中的1),导致部分日期匹配失败返回null;同时按空格分割字符串的方式完全没必要,直接全局匹配整个字符串更高效。

原正则的问题

原正则的日期部分(0[1-9]|[12]\d|3[01])强制要求日必须是两位数字:

  • 0[1-9]:匹配01-09
  • [12]\d:匹配10-29
  • 3[01]:匹配30-31

但你的输入中有2022-10-1这种一位日的格式,自然匹配失败。

修正后的代码方案

1. 捕获所有日期

直接在整个字符串上执行全局匹配,无需分割:

const token = 'project = "HRT: Human Resource Ticketing" AND (("Time to first response" = breached() OR "Time to resolution" = breached()) AND resolution = Done AND "Request Type" = "Payroll Dispute (HR)") AND (createdDate >= 2022-10-1 AND createdDate  <= 2022-10-31)';
// 修正正则:允许日是一位或两位数字(0?[1-9])
const dateRegex = /([12]\d{3}-(0[1-9]|1[0-2])-(0?[1-9]|[12]\d|3[01]))/g;
const matchedDates = token.match(dateRegex);
console.log(matchedDates); // 输出 ["2022-10-1", "2022-10-31"]

2. 替换日期示例

如果要将日期格式统一为两位日(如2022-10-1→2022-10-01),可以用replace方法实现:

const replacedToken = token.replace(dateRegex, (match) => {
  const [year, month, day] = match.split('-');
  // 补全日和月的前导0
  return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`;
});
console.log(replacedToken);

原代码返回null的具体原因

你按空格分割后,2022-10-1这个单独的字符串无法匹配原正则(因为日是一位),所以返回null;而2022-10-31是符合原正则的,应该能匹配到结果,但你可能只注意到了第一个null而忽略了第二个匹配结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 21:05:37