2017-04-19 248 views
0

我使用下面的代码来验证dd/mm/yyyydd.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})$/,基本上使用与指定的相同的捕获组,但这似乎不起作用,“匹配”出现为空。我已阅读了几篇文章,但似乎缺少某些东西。我能做些什么来完成这项工作。

JS小提琴 - https://jsfiddle.net/90dstrx5/

+0

这里是一个更新的小提琴 - https://jsfiddle.net/90dstrx5/1/。使用两种不同的格式,并检查是否有匹配。 – Pugazh

+0

@Pugazh我不认为它的作品。如果您将日期设为“22/05.2017”,则会发生错误 – whyAto8

+0

该错误是由于日期无效。 22/05.2017是否是有效的日期格式? – Pugazh

回答

3

您可以重写正则表达式如下:

/^(\d{2})([./])(\d{2})\2(\d{4})$/ 
//  ^  ^
//  |   +---- match capturing group #2 
//  +----------------- capturing group #2 

注意的是,“数字”,现在将可在第1,第3和结果第四位;分离器将在第二位置。为了消除任何混淆使用Array.splice()消除它:

function validateDate(date) { 
 
    var matches, d, m, y, cDate, format, dateFormatObj; 
 
    dateFormatObj = { 
 
    format: /^(\d{2})([./])(\d{2})\2(\d{4})$/, 
 
    monthPos: 2, 
 
    datePos: 1, 
 
    yearPos: 3 
 
    }; 
 
    format = dateFormatObj.format; 
 
    matches = format.exec(date); 
 
    if (matches === null) { 
 
    return false; 
 
    } 
 
    matches.splice(2, 1); 
 
    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; 
 
} 
 
console.log(validateDate('22/05/2017')); // true 
 
console.log(validateDate('22/05.2017')); // false

+0

感谢您指出'if(matches === null)return false;' – Pugazh

+0

@Salman是的,这是有效的。谢谢(你的)信息。你能否也让我明白为什么我们有2个而不是1个捕获组?我以为我们只会写\ 1来使用我们之前使用过的同一个捕获组。原因是数字在第一,第三和第四位可用。 – whyAto8

+0

@ whyAto8在我的正则表达式中有4个捕获组,由'('和')'生成。它是包含'.'或'/'的第二组。 –

1

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

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

 
    if (matches == null) 
 
    return false; 
 

 
    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'))

+0

@Puzagh是的,这是一个解决方法..但我会更倾向于使用捕获组,因为我将继续添加更多的分隔符。 – whyAto8