225

dd/mm/yyyy正規表現を使用して、フォーマットの日付文字列を検証する必要があります。

この正規表現は を検証しますが、次dd/mm/yyyyのような無効な日付は検証しません31/02/4500:

^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$

dd/mm/yyyyうるう年をサポートする形式を検証するための有効な正規表現は何ですか?

4

25 に答える 25

403

貼り付けた正規表現はうるう年を正しく検証しませんが、同じ投稿に検証するものがあります。dd/mm/yyyydd-mm-yyyyまたはを取るように修正しましたdd.mm.yyyy

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

アルンが彼の回答とここで提供したリンクで少しテストしましたが、うまくいくようです。

2019 年 2 月 14 日編集: 次のような日付を許可する正規表現に含まれていたコンマを削除しました29-0,-11

于 2013-03-19T16:19:55.663 に答える
280

@Ofir Luzon が提供する正規表現を、私の要件に従って、dd-mmm-YYYY、dd/mmm/YYYY、dd.mmm.YYYY の形式に拡張しました。同じ要件を持つ他の誰でもこれを参照できます

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

https://regexr.com/39tr1のいくつかのテストケースでテストされています。

この正規表現をよりよく理解するには、次の画像を参照してください。

ここに画像の説明を入力

編集

yyyy/mm/dd、yyyy-mm-dd、または yyyy.mm.dd 用に拡張するいくつかのテスト ケースhttps://regex101.com/r/3TZfyU/1

^(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:(?:(\/|-|\.)(?:0?[13578]|1[02])\1(?:31))|(?:(\/|-|\.)(?:0?[13-9]|1[0-2])\2(?:29|30)))$|
^(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(\/|-|\.)0?2\3(?:29)$|
^(?:(?:1[6-9]|[2-9]\d)?\d{2})(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:0?[1-9]|1\d|2[0-8])$
于 2014-11-17T11:56:10.270 に答える
80

知らせ:

あなたの正規表現は、「4と100の倍数ですが、400の倍数ではない」年には機能しません。そのテストに合格した年はうるう年ではありません。例: 1900、2100、2200、2300、2500 など。つまり、\d\d00 形式のすべての年が同じうるう年のクラスに入れられますが、これは正しくありません。–MuchToLearn

[1901年~2099年]のみ正常に動作します(ふぅ)

dd/mm/yyyy:

うるう年かどうかをチェックします。1900 年から 9999 年までの年が有効です。dd/mm/yyyy のみ

(^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)
于 2013-12-25T13:47:43.650 に答える
27

これを試して。

^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$

http://www.regular-expressions.info/javascriptexample.htmlで正規表現を簡単にテストできます。

于 2013-03-19T05:16:58.920 に答える
13

これらを見て完全に混乱してしまった人のために、ここに私のスクリプトからの抜粋があります。残念ながら、それは日時入力の有効な数字と一致するだけで、2 月 31 日が有効としてマークされますが、多くの人が言っているように、正規表現はこのテストを行うための最良のツールではありません。

'yyyy-MM-dd hh:mm' 形式の日付を照合するには (または実際に好きな順序で)

var dateerrors = false;
var yearReg = '(201[4-9]|202[0-9])';            ///< Allows a number between 2014 and 2029
var monthReg = '(0[1-9]|1[0-2])';               ///< Allows a number between 00 and 12
var dayReg = '(0[1-9]|1[0-9]|2[0-9]|3[0-1])';   ///< Allows a number between 00 and 31
var hourReg = '([0-1][0-9]|2[0-3])';            ///< Allows a number between 00 and 24
var minReg = '([0-5][0-9])';                    ///< Allows a number between 00 and 59
var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');
$('input').filter(function () {return this.id.match(/myhtml_element_with_id_\d+_datetime/);}).each(function (e) {
    if (e > 0) {
        // Don't test the first input. This will use the default
        var val = $(this).val();
        if (val && !val.trim().match(reg)) {
            dateerrors = true;
            return false;
        }
    }
});
if (dateerrors) {
    alert('You must enter a validate date in the format "yyyy-mm-dd HH:MM", e.g. 2019-12-31 19:30');
    return false;
}

上記のスクリプトは、正規表現オブジェクトを構築することから始まります。次に、ID が特定のパターンに一致するすべての入力を見つけて、これらをループします。最初に見つけた入力 ( ) はテストしませんif (e > 0)

少し説明:

var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');

^は試合の開始を意味し、試合の$終了を意味します。

return this.id.match(/myhtml_element_with_id_\d+_datetime/);

\d+は、1 つまたは連続する整数のシーケンスに一致することを意味するためmyhtml_element_with_id_56_datetime、 とmyhtml_element_with_id_2_datetimeは一致しますが、一致しmyhtml_element_with_id_5a_datetimeません。

于 2014-03-28T17:08:48.227 に答える
13

ユーザーのロケールがいつユリウス暦からグレゴリオ暦に切り替わったかを知らなくても、以下は予想できる限り正確であると思います。

順序に関係なく、年、月、日の間の区切り文字として「-」、「/」、または何も受け入れません。

MMddyyyy:

^(((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))[-/]?[0-9]{4}|02[-/]?29[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$

ddMMyyyy:

^(((0[1-9]|[12][0-9]|30)[-/]?(0[13-9]|1[012])|31[-/]?(0[13578]|1[02])|(0[1-9]|1[0-9]|2[0-8])[-/]?02)[-/]?[0-9]{4}|29[-/]?02[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$

yyyyMMdd:

^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00)[-/]?02[-/]?29)$

順序を除けば、これらはすべて、グレゴリオ暦がユリウス暦から分岐する 1700 年まで、ユリウス暦 (4 年ごとのうるう年) に対して正確です。これには 2 つの問題があります。

  1. すべてではありませんが、多くの標準には存在しない 0000 年を受け入れます。ISO 8601 は 0000 年 (紀元前 1 年に相当) を受け入れることに注意してください。
  2. グレゴリオ暦が使用されるようになったときに失われた 10 ~ 13 日をスキップしません。これは地方によって異なりますが。たとえば、ローマ カトリック教会は 1582 年 10 月 5 日から 10 月 14 日までの 10 日間をスキップしましたが、ギリシャ (最後に切り替えた) は 1923 年の 2 月 16 日から 28 日までの 13 日間をスキップしました。 1800年、1900年。

これは、0001 年から 9999 年までの Java のカレンダーの実装に対してテストされており、上記の 1582 年の 10 日間だけが矛盾しています。

于 2015-07-23T19:38:31.570 に答える
9

次の日付形式のいずれかに一致し、先頭のゼロを省略できる正規表現の別のバージョンを次に示します。

正規表現: ^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$

一致:

1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true

正規表現の視覚化

Debuggex デモ

于 2015-04-15T11:14:14.040 に答える
7

ここではdd/mm/yyyy、セパレーターが-.,/年範囲のいずれかになるように記述し0000-9999ました。

うるう年を処理し、先読み、グループのキャプチャ、後方参照をサポートする正規表現向けに設計されています。などには無効ですd/m/yyyy。必要に応じて、さらにセパレーターを追加します[-.,/]

^(?=\d{2}([-.,\/])\d{2}\1\d{4}$)(?:0[1-9]|1\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\d{4}$

regex101 でテストします。Java 文字列として:

"^(?=\\d{2}([-.,\\/])\\d{2}\\1\\d{4}$)(?:0[1-9]|1\\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\\d{4}$"

説明:

(?x) # modifier x: free spacing mode (for comments)
     # verify date dd/mm/yyyy; possible separators: -.,/
     # valid year range: 0000-9999

^    # start anchor

# precheck xx-xx-xxxx,... add new separators here
(?=\d{2}([-.,\/])\d{2}\1\d{4}$)

(?:  # day-check: non caturing group

  # days 01-28
  0[1-9]|1\d|[2][0-8]| 

  # february 29d check for leap year: all 4y / 00 years: only each 400
  # 0400,0800,1200,1600,2000,...
  29
  (?!.02. # not if feb: if not ...
    (?!
      # 00 years: exclude !0 %400 years
      (?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)

      # 00,04,08,12,... 
      \d{2}(?:[02468][048]|[13579][26])
    )
  )|

  # d30 negative lookahead: february cannot have 30 days
  30(?!.02)|

  # d31 positive lookahead: month up to 31 days
  31(?=.(?:0[13578]|10|12))

) # eof day-check

# month 01-12
.(?:0[1-9]|1[012])

# year 0000-9999
.\d{4}

$ # end anchor

SO Regex FAQも参照してください。失敗した場合はお知らせください。

于 2014-09-13T13:38:24.323 に答える
6

ここでこの正規表現を見つけました

^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$

これにより、形式mm/dd/yyyyと有効な日付が正しく検証されます (ただし、そうではありませんm/d/yyyy)。

いくつかのテスト

于 2013-03-19T15:46:29.197 に答える
5

次の式は素晴らしく、簡単に操作できます。

((((0[13578]|1[02])(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)((\/|-|.)(0[1-9]|1[0-9]|2[0-8]))))(\/|-|.)(19([6-9][0-9])|20(0[0-9]|1[0-4])))|((02)(\/|-|.)(29)(\/|-|.)(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26])))

MM/dd/YYYY 形式に従って検証し、1960 年から 2016 年までのうるう年のサポートを許可します。うるう年のサポートを拡張する必要がある場合は、式の次の部分を操作するだけで済みます。

(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]))

これがあなたに大いに役立ったことを願っています

于 2014-06-02T11:21:04.970 に答える
1

MM/DD/YYYY 形式のみを受け入れるAPI を使用しています。Ofirの答えと同じくらいうるう年を行った他の投稿を見つけることができなかったので、それを微調整して、必要な人のためにここに再投稿しています。

/^(?:(?:(?:0[13578]|1[02])(\/)31)\1|(?:(?:0[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:02(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/
于 2015-07-24T14:42:26.303 に答える
1
year  = ((20[012]\d|19\d\d)|(1\d|2[0123])) 
month = ((0[0-9])|(1[012]))
day   = ((0[1-9])|([12][0-9])|(3[01]))

year-month-day = (((20[012]\d|19\d\d)|(1\d|2[0123]))-((0[0-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01])))
day-month-year = (((0[1-9])|([12][0-9])|(3[01]))-((0[0-9])|(1[012]))-((20[012]\d|19\d\d)|(1\d|2[0123])))
year/month/day = (((20[012]\d|19\d\d)|(1\d|2[0123]))\/((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01])))
month/day/year = (((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))
day/month/year = (((0[1-9])|([12][0-9])|(3[01]))\/((0[0-9])|(1[012]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))
day.month.year = (((0[1-9])|([12][0-9])|(3[01]))\.((0[0-9])|(1[012]))\.((20[012]\d|19\d\d)|(1\d|2[0123])))
year.month.day = (((20[012]\d|19\d\d)|(1\d|2[0123]))\.((0[0-9])|(1[012]))\.((0[1-9])|([12][0-9])|(3[01])))


all = (((20[012]\d|19\d\d)|(1\d|2[0123]))-((0[0-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01])))|(((0[1-9])|([12][0-9])|(3[01]))-((0[0-9])|(1[012]))-((20[012]\d|19\d\d)|(1\d|2[0123])))|(((20[012]\d|19\d\d)|(1\d|2[0123]))\/((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01])))|(((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))|(((0[1-9])|([12][0-9])|(3[01]))\/((0[0-9])|(1[012]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))|(((0[1-9])|([12][0-9])|(3[01]))\.((0[0-9])|(1[012]))\.((20[012]\d|19\d\d)|(1\d|2[0123])))|(((20[012]\d|19\d\d)|(1\d|2[0123]))\.((0[0-9])|(1[012]))\.((0[1-9])|([12][0-9])|(3[01])))

その仕事

yyyy-mm-dd
dd-mm-yyyy
yyyy/mm/dd
mm/dd/yyyy
dd/mm/yyyy
dd.mm.yyyy
yyyy.mm.dd

yy-mm-dd
dd-mm-yy
yyyy/mm/dd
mm/dd/yy
dd/mm/yy
dd.mm.yy
yy.mm.dd

ただし、 day =dまたは month =mの場合は機能しません。例: dmyyyy

すべての例 -ここにリンクの説明を入力

于 2022-02-05T11:30:06.077 に答える
0
((((0[13578]|1[02])\/(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)\/(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)(\/(0[1-9]|1[0-9]|2[0-8]))))\/(19([6-9][0-9])|20([0-9][0-9])))|((02)\/(29)\/(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

toMM/DD/YYYYでフォーマットを検証します19602028

うるう年のサポートを拡張する必要がある場合は、追加してください

19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]|3[26]|4[048])))

これも仕事

^((((0[13578]|1[02])[/](0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)[/](0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)([/](0[1-9]|1[0-9]|2[0-8]))))[/](19([6-9][0-9])|20([0-9][0-9])))|((02)[/](29)[/](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

オンラインでチェックするためにmm-dd-yyyy置き換えるより[/]もフォーマットを変更できる場合http://regexr.com/[-]

于 2016-06-28T13:58:58.097 に答える
0

当日のみのご利用:

<input placeholder="day" maxlength="2" minlength="1" formControlName="birthDay" 
   name="birthDay"pattern="(0[1-9]|1[0-9]|2[0-9]|3[0-1])" >/

当月のみのご利用:

 <input placeholder="month" maxlength="2" minlength="1" 
  formControlName="month" name="month" formControlName="month" name="month" pattern="(0[1- 
  9]|1[0-2])">/
于 2020-07-26T13:48:12.870 に答える