2017-04-19 152 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