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

注意を。セパレータは2番目の位置にあります。混乱の使用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

'(一致=== null)がfalseを返すように指していただきありがとうございます。 ' – Pugazh

+0

@サルマンええ、これは動作します。情報をありがとう。私はなぜあなたがグループをキャプチャするために\ 1の代わりに\ 2を持っているのか理解してもらえますか?先ほど使ったものと同じキャプチャグループを使うために\ 1を書くと思った。理由番号は1位、3位、4位で入手可能です。 – whyAto8

+0

@ whyAto8正規表現に '('と ')'で生成された4つの捕捉グループがあります。 '.'または'/'を含む2番目のグループです。 –

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

関連する問題