我正在尝试针对正则表达式验证字符串,我有如下的JS代码:
var regx = new RegExp("([1-9]|1[012])[- /.]([1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d");
if (!regx.test(document.getElementById('toDate').value)) {
alert('invalid from date format... ');
return false;
}
我尝试使用7/4/2017的值进行测试,但它失败了......
我的正则表达式是否错误?...
答案 0 :(得分:4)
你可以编写一个正则表达式来验证字符格式和值的有效性作为日期,但这是困难的方法。
我建议分两步处理问题:格式验证,然后是值验证。
步骤1.验证m/d/yyyy
格式
格式很简单。 1或2位数字,斜杠,1或2位数字,另一个斜杠和4位数字。
/\d{1,2}\/\d{1,2}\/\d{4}/.test('1/4/2018')
//> true
第2步:将字符串验证为合法日期
我认为检查字符串是否代表有效日期的最简单方法是尝试根据它构造Date
,然后检查构造是否产生了您期望的结果。
var potentialDate = new Date(year, month, day)
同样,您可以使用正则表达式来提取字符串的年,月和日部分。
var parts = string.match(/(\d{1,2})\/(\d{1,2})\/(\d{4})/);
var potentialDate = new Date( parts[3] , parts[1] , parts[2] );
或者,如果您重视原始简单性,则可以在'/'
上拆分,因为您已经确认了基本格式。
最后,询问日期对象以确保没有任何组成部分溢出。
if( potentialDate.getFullYear() !== parseInt( parts[3] ) ) { /* error */ }
// etc.
最后一步是必需的,因为javascript允许这样做:
new Date(2018, 13, 1)
//> Tue Feb 05 2019 // month "13" has overflowed to push date into 2019
-
这是硬模式。使用像momentjs或date-fns这样的东西。
答案 1 :(得分:2)
因为您使用的是RegeExp
构造函数,所以您需要使用双斜杠转义数字匹配,以便\\d
代替\d
。
如果你想使用RegExp文字语法,你可以但你需要转义正斜杠。在方括号内转义破折号也是一个好主意。
这应该有效:/([1-9]|1[012])[\- \/.]([1-9]|[12][0-9]|3[01])[\- \/.](19|20)\d\d/
https://regex101.com/对这类事情非常有帮助。
以下是已经输入regex101.com的正则表达式的链接 https://regex101.com/r/Q1uyan/1
请注意,当您没有转义正斜杠时,会出现错误