2017-12-20 24 views
-1

私は、文字列が有効な日付であるかどうか、私のためにチェックし、この次(作業)正規表現、している:Regex Date + Timeは動作しませんが、なぜですか?

(?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(-)(?:0?2\1(?:29)))|(?:(?:[1-9]\d{3})(-)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[13-9]|1[0-2])\2(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8]))))) 

それはこのようになります日付のために働く:07.12.2017

は今、私がしたいですまた、文字列にも正確性をチェックする時間があることを付け加えてください。 07.12.2017, 06:13の有効性を確認します。

私はかつての正規表現(上記の)この式に追加:

, ([0-1]?[0-9]|2[0-3]):[0-5][0-9] 

しかし、それは動作しません。 誰かが私に指摘することができます、私は間違って何ですか?

+0

あなたはどのような言語を使用していますか?コンテキストとは何ですか?あなたがPythonを使用している場合は、正規表現なしでこれを行うことができます(修正するには厄介なエラーはありません) – Arount

+0

私はjsを使用しているので、必要です。 – Madness

+0

フロントエンド?バックエンド?どの風味? – Arount

答えて

0

私がこれに答える前に、正規表現を使用する以外に、2月は正しい月になるのではなく、何年になるかは28日間、その他は正規表現を使用する以外に、これを検証するより良い方法があると言いたいと思います29日間となります。また、「2月に4月ごとに29日間」と同じように単純ではありません。 2100年は、この口実の下でうるう年になると予想されますが、それは400で割り切れないためではありません。

実際の日付ライブラリを使用する方がよいでしょう。それは正規表現は単に悪いツールになることは、日付になると多くの変数。これは、あなたがそれをしたい形式の日付と一致している必要があり

(?:(?:(?:[0-2]\d)\.(?:0\d|1[12]))|(?:30\.(?:0[469]|11))|(?:3[01]\.(?:0[13578]|1[02])))\.\d+(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$

:道のうちそれと

は、ここに私の答えです。

は、それは私がちょうど良く、このための機能を提供するために正規表現をいじりのビットをした

編集Regex101

に取り組んでください。この関数は、うるう年を二重チェックし、日付が有効かどうかのブール値を返します。

function isValidDate(date) { 
 
    let regex = /^(?:((?:[0-2]\d)\.(?:0\d|1[12]))|(30\.(?:0[469]|11))|(3[01]\.(?:0[13578]|1[02])))\.(\d+)(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$/, 
 
    matches = date.match(regex); 
 

 
    if (!matches) { 
 
    return false; 
 
    } 
 

 
    let dayMonth = matches[1] || matches[2] || matches[3], 
 
    year = matches[4], 
 
    valid = !dayMonth || !year ? false : true; 
 

 
    if (dayMonth == "29.02") { 
 
    let divisibleBy = {four: year % 4 === 0, oneHundred: year % 100 === 0, fourHundred: year % 400 === 0 }; 
 
    if (year > 400) { 
 
     if (!divisibleBy.four) { 
 
     valid = false; 
 
     } 
 
     if (divisibleBy.four && divisibleBy.oneHundred && !divisibleBy.fourHundred) { 
 
     valid = false; 
 
     } 
 
    } 
 
    } 
 
    return valid; 
 
} 
 

 
console.log(
 
    isValidDate("29.02.2100"), 
 
    isValidDate("29.02.2000"), 
 
    isValidDate("25.12.2017, 22:00"), 
 
    isValidDate("31.05.1678"), 
 
    isValidDate("32.05.1900"), 
 
    isValidDate("29.02.32000, 06:15") 
 
)

関連する問題