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

JavaScript中匹配DD/MM/YYYY HH:SS格式的正则验证失败问题

问题分析与解决方案

你遇到的问题根源在于RegExp构造函数的使用方式错误,以及不必要的全局(g)标志干扰了test()方法的结果。

具体问题点:

  1. 多余的正则分隔符:当使用RegExp()构造函数时,不需要把正则表达式包裹在/里——这是正则字面量的写法,而构造函数只需要传入纯正则字符串。你写的'/^...$/'里的首尾/会被当成正则的一部分去匹配,自然找不到符合的内容。
  2. 全局标志g的副作用:test()方法配合全局正则时,会在每次调用后记录匹配的位置,下次调用会从上次的位置开始匹配,这对于单次验证场景完全没必要,甚至会导致结果异常。

修正后的代码:

function clean_inputdatetime(datetime) {
  var cleaned_datetime = null;
  // 去掉首尾的/,移除g标志,注意转义构造函数中的/为\/
  var datetime_regex_cond = new RegExp('^([1-9]|([012][0-9])|(3[01]))(\\/)([0]{0,1}[1-9]|1[012])(\\/)\\d\\d\\d\\d (20|21|22|23|[0-1]?\\d):[0-5]?\\d$');
  var regex_success = datetime_regex_cond.test(datetime);
  if (regex_success) {
    cleaned_datetime = Date.parse(datetime);
  }
  return [regex_success, cleaned_datetime];
}

console.log(clean_inputdatetime("09/07/2020 02:00")); // 输出 [true, 1594082400000]

更推荐的写法:正则字面量

如果不需要动态生成正则,直接用正则字面量会更简洁,也不容易出错(不需要转义斜杠):

function clean_inputdatetime(datetime) {
  var cleaned_datetime = null;
  var datetime_regex_cond = /^([1-9]|([012][0-9])|(3[01]))(\/)([0]{0,1}[1-9]|1[012])(\/)\d\d\d\d (20|21|22|23|[0-1]?\d):[0-5]?\d$/;
  var regex_success = datetime_regex_cond.test(datetime);
  if (regex_success) {
    cleaned_datetime = Date.parse(datetime);
  }
  return [regex_success, cleaned_datetime];
}

这样修改后,你的测试用例就能正确返回[true, 对应时间戳]了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:02:48