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-293[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
相关产品推荐
相关产品推荐

