Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 日期格式正则表达式以匹配日期分隔符_Javascript_Regex_Date - Fatal编程技术网

Javascript 日期格式正则表达式以匹配日期分隔符

Javascript 日期格式正则表达式以匹配日期分隔符,javascript,regex,date,Javascript,Regex,Date,我正在使用下面的代码验证dd/mm/yyyy和dd.mm.yyyy格式中的日期格式 function validateDate(date){ var matches, d, m, y, cDate, format, dateFormatObj; dateFormatObj = { format: /^(\d{2})[./](\d{2})[./](\d{4})$/, monthPos: 2, datePos:1, yearPos:3} format = dateFo

我正在使用下面的代码验证
dd/mm/yyyy
dd.mm.yyyy
格式中的日期格式

function validateDate(date){
    var matches, d, m, y, cDate, format, dateFormatObj;
    dateFormatObj = { format: /^(\d{2})[./](\d{2})[./](\d{4})$/, monthPos: 2, datePos:1,    yearPos:3}

    format = dateFormatObj.format;
    matches = format.exec(date);

    d = matches[dateFormatObj.datePos];
    m = matches[dateFormatObj.monthPos] - 1;
    y = matches[dateFormatObj.yearPos];
    cDate = new Date(y, m, d);

    return cDate.getDate() == d && cDate.getMonth() == m && cDate.getFullYear() == y;
}

alert(validateDate('22/05/2017'))
这对我来说很好,可以验证基本日期

我试图修复的是,如果月份、日期和年份值之间的分隔符(/或)不同,则应使其无效

我尝试的是将正则表达式格式更改为
/^(\d{2})[./](\d{2})\1(\d{4})$/
,基本上使用指定的相同捕获组,但这似乎不起作用,“matches”显示为空。我读过几篇文章,但似乎遗漏了一些东西。我能做些什么来让它工作呢


JS Fiddle-

我想不出一种方法来调整正则表达式。但这里有一个解决方法,指定了两个分隔符

函数验证日期(日期){
变量匹配,d,m,y,cDate,format,dateFormatObj;
dateFormatObj={
格式1:/^(\d{2})[.](\d{2})[.](\d{4})$/,
格式2://^(\d{2})[/](\d{2})[/](\d{4})$/,,
月:2,
日期:1,,
年份位置:3
}
format1=dateFormatObj.format1;
format2=dateFormatObj.format2;
matches=format1.exec(日期)| format2.exec(日期);
if(匹配==null)
返回false;
d=匹配的[dateFormatObj.datePos];
m=匹配[dateFormatObj.monthPos]-1;
y=匹配的[dateFormatObj.yearPos];
cDate=新日期(y、m、d);
返回cDate.getDate()==d&&cDate.getMonth()==m&&cDate.getFullYear()==y;
}

警报(validateDate('22/05.2017'))
我想不出调整正则表达式的方法。但这里有一个解决方法,指定了两个分隔符

函数验证日期(日期){
变量匹配,d,m,y,cDate,format,dateFormatObj;
dateFormatObj={
格式1:/^(\d{2})[.](\d{2})[.](\d{4})$/,
格式2://^(\d{2})[/](\d{2})[/](\d{4})$/,,
月:2,
日期:1,,
年份位置:3
}
format1=dateFormatObj.format1;
format2=dateFormatObj.format2;
matches=format1.exec(日期)| format2.exec(日期);
if(匹配==null)
返回false;
d=匹配的[dateFormatObj.datePos];
m=匹配[dateFormatObj.monthPos]-1;
y=匹配的[dateFormatObj.yearPos];
cDate=新日期(y、m、d);
返回cDate.getDate()==d&&cDate.getMonth()==m&&cDate.getFullYear()==y;
}

警报(validateDate('22/05.2017'))
您可以按如下方式重写正则表达式:

/^(\d{2})([./])(\d{2})\2(\d{4})$/
//       ^            ^
//       |            +---- match capturing group #2
//       +----------------- capturing group #2
请注意,“数字”现在将在结果的第一、第三和第四位置可用;分离器将位于第二位置。要消除任何混淆,请使用
Array.splice()
消除混淆:

函数验证日期(日期){
变量匹配,d,m,y,cDate,format,dateFormatObj;
dateFormatObj={
格式:/^(\d{2})([./])(\d{2})\2(\d{4})$/,
月:2,
日期:1,,
年份位置:3
};
format=dateFormatObj.format;
匹配=format.exec(日期);
如果(匹配===null){
返回false;
}
匹配。拼接(2,1);
d=匹配的[dateFormatObj.datePos];
m=匹配[dateFormatObj.monthPos]-1;
y=匹配的[dateFormatObj.yearPos];
cDate=新日期(y、m、d);
返回cDate.getDate()==d&&cDate.getMonth()==m&&cDate.getFullYear()==y;
}
console.log(validateDate('22/05/2017'));//真的

console.log(validateDate('22/05.2017'));//false
您可以按如下方式重写正则表达式:

/^(\d{2})([./])(\d{2})\2(\d{4})$/
//       ^            ^
//       |            +---- match capturing group #2
//       +----------------- capturing group #2
请注意,“数字”现在将在结果的第一、第三和第四位置可用;分离器将位于第二位置。要消除任何混淆,请使用
Array.splice()
消除混淆:

函数验证日期(日期){
变量匹配,d,m,y,cDate,format,dateFormatObj;
dateFormatObj={
格式:/^(\d{2})([./])(\d{2})\2(\d{4})$/,
月:2,
日期:1,,
年份位置:3
};
format=dateFormatObj.format;
匹配=format.exec(日期);
如果(匹配===null){
返回false;
}
匹配。拼接(2,1);
d=匹配的[dateFormatObj.datePos];
m=匹配[dateFormatObj.monthPos]-1;
y=匹配的[dateFormatObj.yearPos];
cDate=新日期(y、m、d);
返回cDate.getDate()==d&&cDate.getMonth()==m&&cDate.getFullYear()==y;
}
console.log(validateDate('22/05/2017'));//真的

console.log(validateDate('22/05.2017'));//false
这是一个更新的小提琴-。使用两种不同的格式,并检查其中是否有匹配的。@Pugazh我认为它不起作用。如果您将日期传递为“2017年5月22日”,则会显示错误,该错误是由于无效日期造成的。
2017年5月22日
是有效的日期格式吗?检查@Pugazh如果用户输入错误,则想法是使“2017年5月22日”无效。这是更新的小提琴-。使用两种不同的格式,并检查其中是否有匹配的。@Pugazh我认为它不起作用。如果您将日期传递为“2017年5月22日”,则会显示错误,该错误是由于无效日期造成的。
2017年5月22日
是有效的日期格式吗?检查@Pugazh如果用户输入错误,想法是使“2017年5月22日”无效。@Puzagh是的,这是一个解决办法。。但我更倾向于使用捕获组,因为我会继续添加更多分隔符。@Puzagh是的,这是一个解决办法。但我更倾向于使用捕获组,因为我会继续添加更多分隔符。@Salman是的,这很有效。谢谢你的信息。您还可以让我理解为什么我们用\2而不是\1来捕获组吗?我想我们应该写\1来使用我们之前使用的同一个捕获组。原因号在第一、第三和第四位置可用。@whyAto8我的正则表达式中有4个捕获组,由
生成。是的,我后来意识到了这一点。拥有有限的正则表达式技能集。无论如何,非常感谢你的帮助。@Salman是的,这很有效。谢谢你的信息。您还可以让我理解为什么我们用\2而不是\1来捕获组吗?我想我们应该写\1来使用我们之前使用的同一个捕获组。这就是这些数字可用的原因吗