Regex เพื่อตรวจสอบรูปแบบวันที่ dd / mm / yyyy


172

ฉันต้องตรวจสอบความถูกต้องของสตริงวันที่สำหรับรูปแบบdd/mm/yyyyด้วยนิพจน์ปกติ

regex นี้ตรวจสอบdd/mm/yyyyแต่ไม่ใช่วันที่ไม่ถูกต้องเช่น31/02/4500:

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

regex ที่ถูกต้องในการตรวจสอบdd/mm/yyyyรูปแบบที่มีการสนับสนุนปีอธิกคืออะไร?


3
ฉันคิดว่ามันอาจช่วยได้ถ้าคุณตั้งความคาดหวังที่ถูกต้องเนื่องจาก regex นี้ไม่ได้ตรวจสอบความถูกต้องของปีอธิกสุรทินอย่างถูกต้อง เช่นไม่มีวันที่ 29 กุมภาพันธ์ 2013 แต่ regex นี้ยืนยันว่าถูกต้อง: regexr.com?346fp
TML

7
ทำไมต้องใช้ Regex? มีวิธีที่ง่ายกว่า (และแม่นยำยิ่งขึ้น) ...
Dan Puzey

2
นิพจน์ทั่วไปใช้สำหรับรูปแบบการจับคู่ไม่ใช่การตรวจสอบค่าตัวเลข ค้นหาสตริงที่น่าจะเป็นด้วย regex จากนั้นตรวจสอบค่าตัวเลขในสิ่งที่ภาษาโฮสต์ของคุณ (PHP, อะไรก็ตาม)
Andy Lester

3
คำตอบนี้ถูกเพิ่มไปยังคำถามที่พบบ่อยสแต็กการล้นปกติของล้นภายใต้
aliteralmind

4
@BurhanKhalid: คุณผิด นิพจน์ปกติเป็นเครื่องมือที่ดีที่สุดสำหรับการตรวจสอบความถูกต้องเนื่องจากอินพุต HTML5 มีคุณสมบัติpatternที่ใช้ชื่อนิพจน์ปกติและเบราว์เซอร์จะตรวจสอบความถูกต้องโดยอัตโนมัติกับ regex โดยไม่ต้องใช้จาวาสคริปต์ใด ๆ เลย เพียงแค่ตั้งค่า regex ในแอตทริบิวต์ pattern!
ความกลัว

คำตอบ:


329

regex ที่คุณวางไม่ตรวจสอบปีอธิกสุรทินอย่างถูกต้อง แต่มีสิ่งหนึ่งที่ไม่อยู่ในตำแหน่งเดียวกัน ผมปรับเปลี่ยนมันจะใช้dd/mm/yyyy, หรือdd-mm-yyyydd.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})$

ฉันทดสอบมันเล็กน้อยในลิงค์ของอรุณที่ให้ไว้ในคำตอบของเขาและที่นี่และดูเหมือนว่าจะใช้งานได้

แก้ไข 14 กุมภาพันธ์ 2019: ฉันได้ลบเครื่องหมายจุลภาคที่อยู่ใน regex ซึ่งอนุญาตให้ใช้วันที่เช่น 29-0,-11


9
มหากาพย์ regex! สิ่งนี้สามารถเปลี่ยนได้อย่างง่ายดายตามรูปแบบ? ตัวอย่างเช่น yyyy-mm-dd และ mm-dd-yyyy ฉันได้ไปทำความเข้าใจกับมันในใจ แต่มันเกินความสามารถของ regex ของฉัน
mrswadge

7
นอกเหนือจากDD/MM/YYYYนี้ regex ยังยอมรับDD/MM/YYซึ่งฉันไม่แน่ใจว่ามันเป็นความตั้งใจเริ่มต้นของโปสเตอร์ หากคุณไม่ต้องการสนับสนุน 'YY' ให้ลบตัวเลือก?ปริมาณทั้งหมดออก
user1485864

2
@PurveshDesai แทนที่แต่ละ0?ด้วยและยังลบเกิดขึ้นครั้งล่าสุดของ0 ?
Ofir Luzon

4
@MaraisRossouw, คุณถูกต้องสำหรับปี 4 หลักมีจริง 3 ?ที่ควรจะถูกลบ: แทนที่ทั้งหมดด้วย(?:1[6-9]|[2-9]\d)? (?:1[6-9]|[2-9]\d)
Ofir Luzon

2
ลดลงโดยเพียงเพื่อพูดแบบนี้: ว้าว และแน่นอนขอบคุณ
Jero Dungog

266

ฉันได้ขยาย regex ที่กำหนดโดย @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})$

และผ่านการทดสอบสำหรับกรณีการทดสอบบางอย่างที่นี่http://regexr.com/39tr1

เพื่อความเข้าใจที่ดีขึ้นสำหรับนิพจน์ทั่วไปนี้โปรดดูภาพนี้: ป้อนคำอธิบายรูปภาพที่นี่


1
ใช่คุณสร้างมันขึ้นมาได้อย่างไร? :)
มีดโกน

ฉันสร้างมันออนไลน์โดยใช้บางเว็บไซต์และตอนนี้ฉันยังจำเว็บไซต์ที่ฉันสร้างภาพนี้ไม่ได้ ฉันจะเพิ่มการอ้างอิงเมื่อฉันจำ :)
Alok Chaudhary

4
@ user3733831 8888เป็นปีที่เป็นไปได้ ฉันคาดว่าจะมีชีวิตอยู่จนถึงอายุประมาณนั้น
Dan Nissenbaum

1
ใช้งานได้ดีแม้ปีอธิกสุรทิน ฉันได้เพิ่มการสนับสนุนสำหรับชื่อเดือนภาษาสเปนสั้น ๆ เช่นกัน
Fer R

2
@AlokChaudhary แผนภาพถูกสร้างขึ้นโดยใช้debuggex.com
Taha BASRI

69

หมายเหตุ:

regexp ของคุณใช้งานไม่ได้นานหลายปีที่ "เป็นทวีคูณของ 4 และ 100 แต่ไม่ใช่ 400" ปีที่ผ่านการทดสอบนั้นไม่ได้กระโดดปี ตัวอย่างเช่น: 1900, 2100, 2200, 2300, 2500, ฯลฯ กล่าวอีกนัยหนึ่งคือทำให้ทุกปีมีรูปแบบ \ d \ d00 ในคลาส leap ปีเดียวกันซึ่งไม่ถูกต้อง - MuchToLearn

ดังนั้นมันจะทำงานได้อย่างถูกต้องสำหรับ [1901 - 2099] (ต๊าย) 😊

วว / ดด / ปปปป:

ตรวจสอบว่าปีอธิกสุรทิน ปีจาก 1900 ถึง 9999 ถูกต้อง เฉพาะวว / ดด / ปปปป

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

7
คำตอบนี้ใช้ได้เฉพาะกับ dd / MM / yyyy ดังนั้นจึงเป็นคำตอบที่ถูกต้อง
Rodrigo

2
@SylvainB ฉันได้แก้ไขแล้ว
gdZeus

2
@ gdZeus ขอบคุณที่ส่งมอบแม้สองปีต่อมา! น่ากลัวที่จะคิดว่าโซลูชันที่ไม่สมบูรณ์ได้รับการตรวจสอบความถูกต้องแล้วที่นี่เป็นเวลานาน
SylvainB

เพื่อให้เร็วขึ้นคุณสามารถทำให้กลุ่มที่ไม่ได้จัดกลุ่มได้ regexr.com/3esom ^ (? :(? :(? :(?: 0 [1-9] | 1 [0-9] | 2 [0-8]) [\ /] (?: 0 [1- 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

ฉันคิดว่าฉันพบข้อผิดพลาด: 29/02/2100ไม่มีอยู่ (2,100 ไม่ใช่ปีอธิกสุรทิน) แต่ก็ยังได้รับการยอมรับตามรูปแบบที่กำหนด
KnorxThieus

17

ลองนี้

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

คุณสามารถทดสอบนิพจน์ทั่วไปได้ที่http://www.regular-expressions.info/javascriptexample.htmlได้อย่างง่ายดาย


2
regex นี้ไม่ได้ตรวจสอบวันที่กับเดือนเช่น30-02-2001... อย่างไรก็ตามขอบคุณสำหรับคำตอบ :)
Nalaka526

12

ฉันสงสัยว่าต่อไปนี้มีความแม่นยำเท่าที่ควรจะเป็นโดยไม่ทราบว่าสถานที่ของผู้ใช้เปลี่ยนจาก Julian ไปเป็นปฏิทิน Gregorian

มันยอมรับทั้ง '-', '/' หรือไม่มีอะไรเป็นตัวคั่นระหว่างปีเดือนและวันไม่ว่าคำสั่ง

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 เมื่อปฏิทินเกรโกเรียนเบี่ยงเบนจากจูเลียน มันมีสองประเด็น:

  1. มันยอมรับปี 0000 ซึ่งไม่มีอยู่ในหลาย ๆ มาตรฐาน แต่ไม่ใช่ทั้งหมด โปรดทราบว่า ISO 8601 จะรับปี 0000 (เทียบเท่า 1 BCE)
  2. ไม่ข้าม 10-13 วันซึ่งหายไปเมื่อปฏิทิน Gregorian มีการใช้งาน สิ่งนี้แตกต่างกันไปตามท้องที่ ตัวอย่างเช่นคริสตจักรโรมันคาทอลิกข้าม 10 วัน, 5 ตุลาคมถึง 14 ตุลาคม 1582 แต่กรีซ (คนสุดท้ายที่จะเปลี่ยน) ข้าม 16 กุมภาพันธ์ถึง 28 จาก 2466, 13 วันโดยไม่คำนึงถึงปีอธิกสุรทินปี 1700 1800 และ 1900

สิ่งนี้ได้รับการทดสอบกับการใช้งานปฏิทินของ Java ตั้งแต่ปี 0001 จนถึงปี 9999 โดยมีความคลาดเคลื่อนเพียง 10 วันข้างต้นใน 1582


YYYYMMDD regex จับคู่ไม่ถูกต้อง [01 | 02 | 03 | 05 | 06 | 07 | 09 | 10 | 11 | 13 | 14 | 15] 00-02-29 regex ^([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)$แก้ไข: ทดสอบกับ python: repl.it/repls/D พึ่งพาBestChapters
kpr

10

สำหรับผู้ที่ดูเหล่านี้และสับสนอย่างสมบูรณ์นี่คือข้อความที่ตัดตอนมาจากสคริปต์ของฉัน น่าเสียดายที่ทั้งหมดนี้ตรงกับตัวเลขที่ถูกต้องในการป้อนข้อมูลวันที่และวันที่ 31 กุมภาพันธ์จะถูกทำเครื่องหมายว่าถูกต้อง แต่อย่างที่หลาย ๆ คนกล่าวไว้ว่า regex ไม่ใช่เครื่องมือที่ดีที่สุดในการทำแบบทดสอบนี้

เพื่อให้ตรงกับวันที่ในรูปแบบ '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;
}

สคริปต์ข้างต้นเริ่มต้นโดยการสร้างวัตถุ regex จากนั้นค้นหาอินพุตทั้งหมดที่มี 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+หมายถึงจับคู่ลำดับเลขจำนวนเต็มเดี่ยวหรือต่อเนื่องดังนั้นmyhtml_element_with_id_56_datetimeและmyhtml_element_with_id_2_datetimeจะจับคู่ แต่myhtml_element_with_id_5a_datetimeจะไม่


8

นี่เป็นอีกรุ่นหนึ่งของ regex ที่จะจับคู่รูปแบบวันที่ต่อไปนี้และอนุญาตให้ละเว้นค่าศูนย์นำหน้า:

regex: ^[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 Demo


4
ไม่ทำงานหากคุณมี13/13/2000= การแข่งขันเป็นจริง
Andrei Krasutski

3
39/39/39 ไม่ใช่วันที่ โปรดหยุดการโหวตสำหรับคำตอบนี้
Warren Sergent

6

นี่ผมเขียนหนึ่งสำหรับdd/mm/yyyyที่คั่นสามารถเป็นหนึ่งในช่วงปี-.,/0000-9999

มันเกี่ยวข้องกับปีอธิกสุรทินและถูกออกแบบมาสำหรับรสชาติของ regex ที่สนับสนุน lookaheads จับภาพกลุ่มและ backreferences 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 ; โปรดแจ้งให้เราทราบหากล้มเหลว


5

พบ reg นี้ที่นี่

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

การทดสอบบางอย่าง


1
ทำงานก่อนปี 2014 ต้องเปลี่ยน | 20 (0 [0-9] | 1 [0-4]))) ถึง | 20 (0 [0-9] | 1 [0-9])) เพื่อสนับสนุนจนกว่า 2019
Tony Dong


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

หวังว่านี่จะช่วยคุณได้มาก


3

คำตอบอื่นที่ตรวจสอบวัน (dd) ขึ้นอยู่กับเดือน (mm) และปี (yyyy) (เช่นตรวจสอบ 29 กุมภาพันธ์ในปีอธิกสุรทิน) และอนุญาตให้ปีตั้งแต่ 0001 ถึง 9999 (0000 ในปีที่ไม่ถูกต้องตามเกรกอเรียน ปฏิทิน)

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

1
ไม่ตรวจสอบ 18/05/0017

1

ฉันกำลังทำงานกับ API ที่เพียงยอมรับ DD / MM / รูปแบบ YYYY ฉันไม่สามารถหาโพสต์อื่นที่เพิ่มขึ้นอย่างรวดเร็วและคำตอบของ Ofir ได้ดังนั้นฉันจึง tweaked และโพสต์ที่นี่อีกครั้งสำหรับใครก็ตามที่อาจต้องการมัน

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

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

จะตรวจสอบMM/DD/YYYYรูปแบบด้วย1960ถึง2028

ถ้าคุณต้องการขยายการสนับสนุนเผ่นปีแล้วเพิ่ม

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/


0

สำหรับวันที่ MM / DD / YYYY คุณสามารถใช้

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

มันตรวจสอบวันที่เหมาะสมและผีเสื้อกลางคืน

จำไว้ว่าคุณสามารถตรวจสอบการแสดงออกปกติของคุณได้ที่

regex101

ที่ฉันแนะนำ :)

มีความสุข!


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 นี้จะตรวจสอบวันที่ในรูปแบบ:

12-30-2016 (mm-dd-yyyy) หรือ 12-3-2016 (mm-d-yyyy) หรือ 1-3-2016 (md-yyyy) หรือ 1-30-2016 (m-dd-yyyy)


0

ฉันรู้ว่ามันเป็นคำตอบของคำถามวง แต่ถ้าเจตนาของคำถามคือ 'ฉันจะตรวจสอบวันที่ได้อย่างไร' ดังนั้นทำไมไม่ลองให้ภาษาโปรแกรมทำงานหนักทั้งหมด (ถ้าคุณใช้ภาษาที่ สามารถ)?

เช่นใน php

$this_date_object = date_create($this_date);

if ($this_date_object == false )
    {

        // process the error

    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.