验证日期的Javascript正则表达式
我对正则表达式相当不熟悉。我正在尝试为mm.dd.yyyy、mm/dd/yyyy或mm-dd-yyyy编写正则表达式。这就是我到目前为止所拥有的,我完全不确定我是否已经接近了验证日期的Javascript正则表达式,javascript,regex,date,Javascript,Regex,Date,我对正则表达式相当不熟悉。我正在尝试为mm.dd.yyyy、mm/dd/yyyy或mm-dd-yyyy编写正则表达式。这就是我到目前为止所拥有的,我完全不确定我是否已经接近了 ^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$ 谢谢 请注意,这将允许它们混淆,即01/02-2010将有效。要停止这一点
^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$
谢谢
请注意,这将允许它们混淆,即01/02-2010
将有效。要停止这一点,请像这样写三遍
/^(?:\d{2}\.\d{2}\.\d{4}|\d{2}\/\d{2}\/\d{4}|\d{2}-\d{2}-\d{4})$/
(或者只是检查一下。)
你的题目是 验证日期的Javascript正则表达式 如果您还需要提取这些部分,请使用括号(
()
)将它们包装起来,这样可以将它们转换为捕获组。如果匹配成功,它们将存储在返回数组的成员中
请注意,这将允许它们混淆,即01/02-2010
将有效。要停止这一点,请像这样写三遍
/^(?:\d{2}\.\d{2}\.\d{4}|\d{2}\/\d{2}\/\d{4}|\d{2}-\d{2}-\d{4})$/
(或者只是检查一下。)
你的题目是 验证日期的Javascript正则表达式
如果您还需要提取这些部分,请使用括号(
()
)将它们包装起来,这样可以将它们转换为捕获组。如果匹配成功,它们将存储在返回数组的成员中。在PHP中,我使用命名匹配,因此不同的格式很容易:
$format = 'y-m-d'; // or 'd-m-y' or 'd/m/y' etc
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>(?:1|2)\d{3})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';
但我不认为是这样。。。(请注意实际捕获/匹配之前的\3、\2和\1)
按顺序1、2、3匹配。按顺序3,2,1,它没有。我不确定PHP中的
\1
、\2
和\3
do=)使用命名匹配,因此不同的格式很容易:
$format = 'y-m-d'; // or 'd-m-y' or 'd/m/y' etc
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>(?:1|2)\d{3})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';
但我不认为是这样。。。(请注意实际捕获/匹配之前的\3、\2和\1)
按顺序1、2、3匹配。按顺序3,2,1,它没有。不确定\1
、\2
和\3
做什么=)
将匹配01/01/2000
,01.01.2000
,而不是01/01.2000
/^(\d{2})([.\/-])(\d{2})\2(\d{4})$/
包装三个日期部分时也会执行相同的操作
将匹配01/01/2000
,01.01.2000
,而不是01/01.2000
/^(\d{2})([.\/-])(\d{2})\2(\d{4})$/
包装三个日期部分时也会这样做。我不喜欢对
、-
和/
分别重复一次模式
请尝试以下方法:
^(\d{2})(\/|-|\.)(\d{2})\2(\d{4})$
请注意,使用
\2
表示第二个匹配组,即
、-
或/
组。这将确保mm和dd之间的任何符号都将在dd和yyyy之间匹配。我不喜欢对
、-
和/
每个模式重复一次
请尝试以下方法:
^(\d{2})(\/|-|\.)(\d{2})\2(\d{4})$
请注意,使用
\2
表示第二个匹配组,即
、-
或/
组。这将确保mm和dd之间的任何符号都将在dd和yyyy之间匹配。一个有趣的技巧是,您可以使用Date.parse()执行以下操作:
// 1303617600000
Date.parse('4/24/2011')
// 1303617600000
Date.parse('4-24-2011')
// 1303617600000
Date.parse('4.24.2011')
// NaN
Date.parse('4/32/2011')
// NaN
Date.parse('foo')
这不是很严格。例如,它将成功地将2011年2月30日解析为有效。这是一个很好的99%严格的健全性测试。一个有趣的技巧是,您可以使用Date.parse()执行以下操作:
// 1303617600000
Date.parse('4/24/2011')
// 1303617600000
Date.parse('4-24-2011')
// 1303617600000
Date.parse('4.24.2011')
// NaN
Date.parse('4/32/2011')
// NaN
Date.parse('foo')
这不是很严格。例如,它将成功地将2011年2月30日解析为有效。这是一个很好的99%严格的健全性测试。我看到一些怪物正则表达式与实际日期匹配,例如,它们与04/31/yyyy或02-29-2011不匹配 更简单的方法是尝试从输入中创建一个日期,然后检查输入
function isvalid_mdy(s){
var day, A= s.split(/\D+/).map(function(itm){
return parseInt(itm, 10)
});
try{
day= new Date(A[2], A[0]-1, A[1]);
if(day.getMonth()+1== A[0] && day.getDate()== A[1]) return day;
throw 'Bad Date Format';
}
catch(er){
return NaN;
}
}
var s1= '04/31/2011';
isvalid_mdy(s1)
/* returned value: (Number)
NaN
*/我看到一些怪物正则表达式与实际日期匹配——例如,它们与04/31/yyyy或02-29-2011不匹配 更简单的方法是尝试从输入中创建一个日期,然后检查输入
function isvalid_mdy(s){
var day, A= s.split(/\D+/).map(function(itm){
return parseInt(itm, 10)
});
try{
day= new Date(A[2], A[0]-1, A[1]);
if(day.getMonth()+1== A[0] && day.getDate()== A[1]) return day;
throw 'Bad Date Format';
}
catch(er){
return NaN;
}
}
var s1= '04/31/2011';
isvalid_mdy(s1)
/* returned value: (Number)
NaN
*/@alex:我应该把它放在哪里?谢谢@willis您可以像这样使用它
dateStr.match(/regex here/)
。如果它返回null
,则它不匹配。/^\d{2}([.\/-])\d{2}\1\d{4}$/
不需要第二个示例。@alex:我到底把它放在哪里?谢谢@willis您可以像这样使用它dateStr.match(/regex here/)
。如果它返回null
,则它不匹配。/^\d{2}([.\/-])\d{2}\1\d{4}$/
第二个例子不需要。@Dave Ward:我不想挤兑你的答案,但你能完整地写出来吗,我不理解它的原样?谢谢你确定这样行吗<代码>变量d=日期解析(“4-24-2011”)givesNaN
@manojlds:是的,我在发布之前在控制台上测试了所有这些。但是,如果浏览器的区域设置不是使用mm/dd/yyyy日期的区域设置,则可能不起作用。它适用于“/”但不适用于“.”和“-”,无论是mm/dd/yyyy还是dd/mm/yyyy。无论如何,如果基于用户的区域设置等,此操作不起作用,则解决方案是错误的。@willis0924:Test forDate.parse(dateString)!=NaN
@Dave Ward:我不是想挤兑你的答案,但是你能把它完整地写出来吗?我不太明白它的意思?谢谢你确定这样行吗<代码>变量d=日期解析(“4-24-2011”)givesNaN
@manojlds:是的,我在发布之前在控制台上测试了所有这些。但是,如果浏览器的区域设置不是使用mm/dd/yyyy日期的区域设置,则可能不起作用。它适用于“/”但不适用于“.”和“-”,无论是mm/dd/yyyy还是dd/mm/yyyy。无论如何,如果基于用户的区域设置等,此操作不起作用,则解决方案是错误的。@willis0924:Test forDate.parse(dateString)!=NaN
。这是我迄今为止见过的最好的一次。好的,这是我见过的最好的。很好。@kennebec为您提供了一个比正则表达式好得多的完美解决方案,您应该接受他的答案。@kennebec为您提供了一个比正则表达式好得多的完美解决方案,您应该接受他的答案。所以\1
引用了第一组?我想了解,谢谢你