-1

javascript regexを使用して日付入力を検証しようとしていますが、有効な日付が無効として返されます。私は正規表現の専門家ではないので、何が悪いのかわかりません。

/^([0-9]d{2})+(\.|-|\/)+([0-9]d{2})+(\.|-|\/)+([0-9]d{4})+$/

これらの日付形式を受け入れてほしい:

2001年4月23日

2001年4月23日

2001年4月23日

もともと私はこれを持っていましたが、それは23/04 / 2001jhsdgfのような最後に他のキャラクターとの日付を受け入れていました:

/\d{2}(\.|-|\/)\d{2}(\.|-|\/)\d{4}/;
4

2 に答える 2

4

元の正規表現を取得し、新しい正規表現から^とを追加するだけです。$問題が解決しました。

編集:しかし、実際には、これは混乱であり、代わりに(\.|-|\/)すべきです。[.\/-]

編集2:とはいえ、最初のものを作成する場合は([.\/-])、2番目のものをに置き換えることができ、\1両方のセパレーターが同じである必要があります。

于 2013-02-04T17:06:32.617 に答える
4

次のような正規表現を使用して、日付が構文的に正しいかどうかを確認できます。

/^(\d{1,2})([-\.\/])(\d{1,2})\2(\d{4})$/
  • ^文字列の先頭と$末尾にそれぞれ一致します
  • \d{1,2}1桁または2桁に一致
  • \d{4}正確に 4 桁に一致
  • \22 番目のキャプチャ グループ ( - . /)でキャプチャされた文字列に一致します。

一致した場合、一致した日付、月、年を使用して新しい日付を作成し、結果の日付、月、年を一致した値と比較できます。これを行う関数を次に示します。

function checkDate(dateText) {
    var match = dateText.match(/^(\d{1,2})([-\.\/])(\d{1,2})\2(\d{4})$/);
    // "31.04.2012" -> ["31.04.2012", "31", ".", "04", "2012"]
    if (match === null) {
        return false;
    }
    var date = new Date(+match[4], +match[3] - 1, +match[1]);
    return date.getFullYear() == +match[4] && 
      date.getMonth() == +match[3] - 1 && 
      date.getDate() == +match[1];
}
checkDate("30.04.2013"); // true
checkDate("31-04-2013"); // false (April has 30 days)
  • +文字列を数値に変換するために使用されます(+"01"になります1
  • 月は 0 ベース (0 = 1 月、1 = 2 月、...)
  • 上記の例では、日付がdd-mm-yyyyフォーマットされていることを前提としています

Dateオブジェクトは、無効な日付を修正しようとします。31-4-2013yieldsなどの日付を作成しようとすると1-05-2013、上記の関数は結果の日付を入力パラメーターと比較して有効性を確認します。

于 2013-02-04T19:08:42.727 に答える