Regex untuk memvalidasi format tanggal dd / mm / yyyy

172

Saya perlu memvalidasi string tanggal untuk format dd/mm/yyyydengan ekspresi reguler.

Regex ini memvalidasi dd/mm/yyyy, tetapi bukan tanggal yang tidak valid seperti 31/02/4500:

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

Apa itu regex yang valid untuk memvalidasi dd/mm/yyyyformat dengan dukungan tahun kabisat?

Nalaka526
sumber
3
Saya pikir mungkin membantu jika Anda menetapkan harapan yang akurat, karena regex ini TIDAK, pada kenyataannya, memvalidasi tahun kabisat dengan benar; mis., tidak ada 29 Februari di 2013, tetapi regex ini menegaskan bahwa hal itu valid: regexr.com?346fp
TML
7
Kenapa dengan Regex? Ada cara yang lebih mudah (dan lebih akurat) ...
Dan Puzey
2
Ekspresi reguler adalah untuk pola yang cocok, tidak memeriksa nilai numerik. Temukan string yang mungkin dengan regex, lalu periksa nilai numeriknya dalam apa pun bahasa host Anda (PHP, apa pun).
Andy Lester
3
Jawaban ini telah ditambahkan ke FAQ Ekspresi Reguler Overflow Overflow , di bawah "Tugas Validasi Umum".
aliteralmind
4
@ BurhanKhalid: Anda salah. Ekspresi reguler adalah alat terbaik untuk validasi, karena input HTML5 memiliki atribut bernama patternyang mengambil ekspresi reguler, dan browser memvalidasi secara otomatis terhadap regex tanpa menggunakan javascript sama sekali. Hanya dengan menetapkan regex pada atribut pola!
awe

Jawaban:

329

Regex yang Anda tempelkan tidak memvalidasi tahun kabisat dengan benar, tetapi ada yang tidak di pos yang sama . Saya memodifikasinya untuk diambil dd/mm/yyyy, dd-mm-yyyyatau 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})$

Saya mengujinya sedikit di tautan yang disediakan Arun dalam jawabannya dan juga di sini dan tampaknya berhasil.

Sunting 14 Februari 2019: Saya telah menghapus koma yang ada di regex yang memungkinkan tanggal seperti 29-0,-11

Ofir Luzon
sumber
9
Regex epik! Seberapa mudah ini bisa dipertukarkan menurut format? Misalnya yyyy-mm-dd dan mm-dd-yyyy. Saya harus memahaminya dengan itu dalam pikiran, tapi itu di luar kemampuan regex saya.
mrswadge
7
Selain itu DD/MM/YYYY, regex ini juga menerima DD/MM/YYyang saya tidak yakin dengan maksud awal poster. Jika Anda ingin tidak mendukung 'YY', maka hapus semua ?quantifiers opsional .
user1485864
2
@PurveshDesai ganti masing 0?- masing dengan 0, dan juga hapus kejadian terakhir ?.
Ofir Luzon
4
@MaraisRossouw, Anda benar, selama 4 digit tahun, sebenarnya ada 3 ?yang harus dihapus: ganti semua (?:1[6-9]|[2-9]\d)?dengan (?:1[6-9]|[2-9]\d).
Ofir Luzon
2
Mampir hanya untuk mengatakan ini: WOW dan tentu saja terima kasih
Jero Dungog
266

Saya telah memperpanjang regex yang diberikan oleh @Ofir Luzon untuk format dd-mmm-YYYY, dd / mmm / YYYY, dd.mmm.YYYY sesuai kebutuhan saya. Orang lain dengan persyaratan yang sama dapat merujuk ini

^(?:(?: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})$

dan diuji untuk beberapa kasus uji di sini http://regexr.com/39tr1 .

Untuk pemahaman yang lebih baik untuk ekspresi Reguler ini merujuk gambar ini: masukkan deskripsi gambar di sini

Alok Chaudhary
sumber
1
Ya, bagaimana Anda menghasilkannya? :)
Razor
Saya membuatnya secara online menggunakan beberapa situs web dan sekarang saya juga tidak ingat situs web tempat saya membuat gambar ini. Saya akan menambahkan referensi begitu saya ingat :)
Alok Chaudhary
4
@ user3733831 8888adalah tahun yang memungkinkan. Saya berharap untuk hidup sampai usia itu.
Dan Nissenbaum
1
Bekerja sangat baik bahkan untuk tahun kabisat. Saya menambahkan dukungan untuk nama-nama bulan pendek Spanyol, juga.
Fer R
2
@AlokChaudhary, diagram dibuat menggunakan debuggex.com
Taha BASRI
69

Memperhatikan:

Regexp Anda tidak berfungsi selama bertahun-tahun yang "adalah kelipatan 4 dan 100, tetapi tidak 400". Tahun-tahun yang lulus ujian itu bukan tahun kabisat. Sebagai contoh: 1900, 2100, 2200, 2300, 2500, dll. Dengan kata lain, itu menempatkan semua tahun dengan format \ d \ d00 dalam kelas yang sama tahun kabisat, yang tidak benar. - Banyak Belajar

Jadi itu berfungsi dengan baik hanya untuk [1901 - 2099] (Whew) 😊

hh / MM / tttt:

Cek apakah tahun kabisat. Tahun dari 1900 hingga 9999 adalah valid. Hanya dd / MM / tttt

(^(((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)$)
gdZeus
sumber
7
Jawaban ini hanya berfungsi dengan dd / MM / yyyy. Karena itu, adalah jawaban yang tepat.
Rodrigo
2
@ SilvainB Saya telah memperbaikinya
gdZeus
2
@ gdZeus Terima kasih telah mengirim, bahkan dua tahun kemudian! Menakutkan untuk berpikir bahwa solusi yang tidak lengkap telah divalidasi di sini sejak lama.
SylvainB
Untuk membuatnya lebih cepat, Anda dapat membuat grup tidak mengelompokkan. regexr.com/3esom ^ (? :(? :(? :( ?: 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)) $
Matt Vukomanovic
Saya kira saya menemukan kesalahan: 29/02/2100tidak ada (2100 BUKAN tahun kabisat), tetapi masih diterima oleh pola yang diberikan.
KnorxThieus
17

coba ini.

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

Anda dapat menguji ekspresi reguler di http://www.regular-expressions.info/javascriptexample.html dengan mudah.

DI
sumber
2
regex ini tidak memvalidasi tanggal dengan bulan seperti 30-02-2001... toh terima kasih atas jawabannya :)
Nalaka526
12

Saya menduga bahwa yang berikut ini seakurat yang dapat diharapkan tanpa mengetahui kapan lokal pengguna beralih dari Julian ke kalender Gregorian.

Ia menerima '-', '/', atau tidak sama sekali sebagai pemisah antara tahun, bulan, dan hari, terlepas dari urutannya.

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)$

Selain pesanan, semua ini akurat untuk Kalender Julian (tahun kabisat setiap empat tahun) hingga 1700, ketika Kalender Gregorian menyimpang dari Julian. Ini memiliki dua masalah:

  1. Ia menerima tahun 0000, yang tidak ada di banyak standar, tetapi tidak semua. Perhatikan bahwa ISO 8601 menerima tahun 0000 (setara dengan 1 BCE).
  2. Itu tidak melewati 10-13 hari yang hilang ketika Kalender Gregorian mulai digunakan. Ini berbeda-beda menurut daerah. Sebagai contoh, Gereja Katolik Roma melewatkan 10 hari, 5 Oktober hingga 14 Oktober 1582, tetapi Yunani (yang terakhir berganti) melewatkan 16 Februari hingga 28 tahun 1923, 13 hari, harus memperhitungkan tahun kabisat tahun 1700, 1800, dan 1900.

Ini telah diuji terhadap implementasi kalender Jawa dari tahun 0001 hingga tahun 9999 dengan satu-satunya perbedaan adalah 10 hari yang disebutkan di atas pada tahun 1582.

Jason Greanya
sumber
Regex YYYYMMDD salah cocok [01 | 02 | 03 | 05 | 06 | 07 | 09 | 10 | 11 | 13 | 14 | 15] 00-02-29. Regex Dikoreksi: ^([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])00)[-/]?02[-/]?29)$. Diuji dengan python: repl.it/repls/DependentBestChapters
kpr
10

Bagi mereka yang melihat ini dan benar-benar bingung, berikut adalah kutipan dari skrip saya. Sayangnya, yang dilakukannya hanyalah mencocokkan angka yang valid dalam input waktu tanggal, dan 31 Februari akan ditandai sebagai valid, tetapi seperti yang telah dikatakan banyak orang, regex sebenarnya bukan alat terbaik untuk melakukan tes ini.

Untuk mencocokkan tanggal dalam format 'yyyy-MM-dd hh: mm' (Atau memang dalam urutan apa pun yang Anda suka)

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;
}

Script di atas dimulai dengan membangun objek regex. Kemudian menemukan semua input yang id-nya cocok dengan pola tertentu dan kemudian mengulanginya. Saya tidak menguji input pertama yang saya temukan ( if (e > 0)).

Sedikit penjelasan:

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

^berarti awal pertandingan, sedangkan $akhir pertandingan.

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

\d+berarti cocok dengan urutan bilangan bulat tunggal atau bersebelahan, jadi myhtml_element_with_id_56_datetimedan myhtml_element_with_id_2_datetimeakan cocok, tetapi myhtml_element_with_id_5a_datetimetidak akan

Luke Madhanga
sumber
8

Berikut adalah versi lain dari regex yang cocok dengan salah satu format tanggal berikut dan memungkinkan nol di depan dihapus:

Regex: ^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$

Cocok:

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

Visualisasi ekspresi reguler

Demo Debuggex

Solusi Sederhana
sumber
4
tidak bekerja jika Anda memiliki 13/13/2000= Cocok adalah benar
Andrei Krasutski
3
39/39/39 bukan kencan. Tolong berhenti memberikan suara untuk jawaban ini.
Warren Sergent
6

Di sini saya menulis satu untuk dd/mm/yyyymana pemisah dapat menjadi salah satu -.,/rentang tahun 0000-9999.

Ini berhubungan dengan tahun kabisat dan dirancang untuk citarasa regex, yang mendukung tampilan kepala, menangkap kelompok dan referensi. TIDAK berlaku untuk seperti d/m/yyyy. Jika perlu, tambahkan pemisah lebih lanjut[-.,/]

^(?=\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}$

Tes di regex101 ; sebagai string 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}$"

menjelaskan:

(?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

Juga lihat FAQ Regex SO ; Tolong beri tahu saya, jika gagal.

Jonny 5
sumber
5

Menemukan reg ini di sini

^(((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))))$

Ini memvalidasi format mm/dd/yyyydan tanggal yang valid dengan benar (tetapi tidak m/d/yyyy).

Beberapa tes

Nalaka526
sumber
1
Hanya berfungsi sebelum 2014, harus mengubah | 20 (0 [0-9] | 1 [0-4]))) menjadi | 20 (0 [0-9] | 1 [0-9]))) untuk mendukung hingga 2019
Tony Dong
5
"^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"

akan memvalidasi tanggal antara 1900-2099

pengguna3575114
sumber
5

Ungkapan berikut ini bagus dan mudah untuk dimanipulasi:

((((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])))

Ini memvalidasi sesuai dengan format MM / dd / YYYY dan memungkinkan dukungan tahun kabisat dari 1960 hingga 2016. Jika Anda memerlukan dukungan tahun kabisat Anda hanya perlu memanipulasi bagian ekspresi ini:

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

Semoga ini banyak membantu Anda

Mengejar
sumber
3

Jawaban lain yang memvalidasi hari (dd) tergantung pada bulan (mm) dan tahun (yyyy) (yaitu, juga memvalidasi Februari Feb di tahun kabisat) dan memungkinkan tahun mulai dari 0001 hingga 9999 (0000 pada tahun yang tidak valid menurut Gregorian kalender)

^(?:(?:(?:0[1-9]|[12]\d|3[01])/(?:0[13578]|1[02])|(?:0[1-9]|[12]\d|30)/(?:0[469]|11)|(?:0[1-9]|1\d|2[0-8])/02)/(?!0000)\d{4}|(?:(?:0[1-9]|[12]\d)/02/(?:(?!0000)(?:[02468][048]|[13579][26])00|(?!..00)\d{2}(?:[02468][048]|[13579][26]))))$
Debanshu Kundu
sumber
1
tidak memvalidasi 18/05/0017
1

Saya bekerja dengan API yang hanya menerima format MM / DD / YYYY. Saya tidak dapat menemukan posting lain yang melakukan lompatan bertahun-tahun sebaik jawaban Ofir , jadi saya men-tweak dan mempostingnya kembali di sini untuk siapa saja yang mungkin membutuhkannya.

/^(?:(?:(?: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})$/
Daniel
sumber
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])))

akan memvalidasi MM/DD/YYYYformat dengan 1960ke2028

jika Anda perlu memperpanjang dukungan tahun kabisat maka tambahkan

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

ini juga bekerja

^((((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])))

jika Anda dapat mengubah format yang mm-dd-yyyydari ganti [/]untuk [-] juga memeriksa online http://regexr.com/

mahesh
sumber
0

Untuk tanggal MM / DD / YYYY dapat Anda gunakan

^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$

Ini memverifikasi hari dan ngengat yang tepat.

Ingatlah bahwa Anda dapat memeriksa ekspresi reguler Anda di

regex101

yang saya rekomendasikan :)

Selamat bersenang-senang!

Przemysław Sienkiewicz
sumber
0
^(((([13578]|0[13578]|1[02])[-](0[1-9]|[1-9]|1[0-9]|2[0-9]|3[01]))|(([469]|0[469]|11)[-]([1-9]|1[0-9]|2[0-9]|3[0]))|((2|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])))

regex ini akan memvalidasi tanggal dalam format:

12-30-2016 (mm-dd-yyyy) atau 12-3-2016 (mm-d-yyyy) atau 1-3-2016 (md-yyyy) atau 1-30-2016 (m-dd-yyyy)

mexekanez
sumber
0

Saya tahu ini adalah jawaban tangensial untuk pertanyaan itu, tetapi jika maksud pertanyaannya adalah 'bagaimana saya memvalidasi kencan?', Lalu mengapa tidak mencoba membiarkan bahasa pemrograman melakukan semua kerja keras (jika Anda menggunakan bahasa yang bisa)?

misalnya dalam php

$this_date_object = date_create($this_date);

if ($this_date_object == false )
    {

        // process the error

    }
Neil Iosson
sumber