JavaScript中匹配DD/MM/YYYY HH:SS格式的正则验证失败问题
问题分析与解决方案
你遇到的问题根源在于RegExp构造函数的使用方式错误,以及不必要的全局(g)标志干扰了test()方法的结果。
具体问题点:
- 多余的正则分隔符:当使用
RegExp()构造函数时,不需要把正则表达式包裹在/里——这是正则字面量的写法,而构造函数只需要传入纯正则字符串。你写的'/^...$/'里的首尾/会被当成正则的一部分去匹配,自然找不到符合的内容。 - 全局标志
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
相关产品推荐
相关产品推荐

