นิพจน์ทั่วไปวันที่ของ Javascript DD/MM/YYYY

ฉันรู้ว่ามีเธรด regex มากมาย โดยฉันต้องการรูปแบบเฉพาะที่หาไม่พบที่ไหนเลย

Regex นี้ตรวจสอบความถูกต้องในรูปแบบ ปปปป-ดด-วว

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

ฉันต้องการให้รูปแบบเป็น วว/ดด/ปปปป (วันแรกเนื่องจากเป็นภาษาสเปน และไม่ควรอนุญาตเฉพาะ "/", "-" เท่านั้น)

ฉันค้นหาไลบรารี regex หลายแห่งและฉันคิดว่าอันนี้น่าจะใช้ได้ ... แต่เนื่องจากฉันไม่คุ้นเคยกับ regex ฉันจึงไม่แน่ใจว่ามันจะตรวจสอบเช่นนั้นหรือไม่

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

ฉันก็ไม่รู้เหมือนกันว่าจะหลบเลี่ยงเครื่องหมายทับ ฉันพยายาม "ดู" ตรรกะในสตริง แต่มันก็เหมือนกับการลอง "ดู" โค้ดเมทริกซ์ให้ฉัน ฉันกำลังวางสตริง regex ในตัวเลือก .js

[...]  },
"date": {
                    "regex": (0[1-9]|[12][0-9]|3[01])[ \.-](0[1-9]|1[012])[ \.-](19|20|)\d\d,
                    "alertText": "Alert text AAAA-MM-DD"
                },
"other type..."[...]

ดังนั้นหาก regex ใช้ได้ ฉันจะหลีกเลี่ยงได้อย่างไร หากไม่เป็นเช่นนั้น regex ที่ถูกต้องคืออะไร และฉันจะหลีกเลี่ยงได้อย่างไร :ป

ขอบคุณมาก


person Juan Ignacio    schedule 28.03.2011    source แหล่งที่มา
comment
คุณแน่ใจหรือว่า regex เป็นตัวเลือกที่ดีที่สุดที่นี่   -  person Alex    schedule 29.03.2011
comment
comment
ใช้ (((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|(([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|((29)(\/)(02)([/])([02468][048]00))|((29)([/])(02)([/])([13579][26]00))|((29)([/])(02)([/])([0-9][0-9][0][48]))|((29)([/])(02)([/])([0-9][0-9][2468][048]))|((29)([/])(02)([/])([0-9][0-9][13579][26]))) เพื่อตรวจสอบวันที่ในรูปแบบ วว/ดด/ปปปป แม้จะใช้ได้กับการตรวจสอบความถูกต้องของ Leay year เช่น จะใช้ตรวจสอบวันที่ 29/02/2020 แต่ไม่ใช่ 29/02/2019 และไม่ใช่ 29/02/2100 ด้วย   -  person Th. H Chauhan    schedule 17.04.2020


คำตอบ (12)


คุณสามารถใช้ regex ที่ตรวจสอบ YYYY/MM/DD แล้วพลิกไปรอบ ๆ เพื่อรับสิ่งที่คุณต้องการสำหรับ DD/MM/YYYY:

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

BTW - regex นี้ตรวจสอบความถูกต้องของ DD/MM/YYYY หรือ DD-MM-YYYY

ป.ล. ซึ่งจะช่วยให้วันที่เช่น 31/02/4899

person mVChr    schedule 28.03.2011
comment
ฉันพยายามพลิกมันไปรอบๆ แต่ฉันไม่แน่ใจว่าแต่ละบล็อกเริ่มต้นจากตรงไหน regex นี้สามารถแก้ไขได้เพื่ออนุญาต / / แต่ไม่ - - หรือไม่ ขอบคุณ! - person Juan Ignacio; 30.03.2011
comment
^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/\-]\d{4}$ Regex หากคุณต้องการยอมรับ DD/MM/YYYY ไม่ใช่ DD-MM-YYYY - person lukehillonline; 23.08.2016
comment
ไม่มีการแข่งขันในวันที่ 06/20/2016 เช่นกัน - person Paul; 15.09.2016
comment
ดูคำตอบของ @ OammieR สำหรับ regex ที่ครอบคลุมมากขึ้น stackoverflow.com/a/14807681/246616 - person mVChr; 07.10.2016

regex นั้นดีสำหรับการจับคู่รูปแบบทั่วไป แต่ฉันคิดว่าคุณควรย้ายการแยกวิเคราะห์ไปที่คลาส Date เช่น:

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);
  return (m) ? new Date(m[3], m[2]-1, m[1]) : null;
}

ตอนนี้คุณสามารถใช้ฟังก์ชันนี้เพื่อตรวจสอบวันที่ที่ถูกต้องได้ อย่างไรก็ตาม หากคุณต้องการตรวจสอบจริงโดยไม่ต้องเลื่อน (เช่น "31/2/2010" ไม่เปลี่ยนเป็น "3/3/2010") โดยอัตโนมัติ แสดงว่าคุณประสบปัญหาอื่น

[แก้ไข] หากคุณต้องการตรวจสอบโดยไม่ต้องกลิ้ง คุณสามารถเพิ่มเช็คเพื่อเปรียบเทียบกับสตริงดั้งเดิมเพื่อให้แน่ใจว่าเป็นวันที่เดียวกัน:

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , nonRolling = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (nonRolling) ? d : null;
}

[แก้ไข2] หากคุณต้องการจับคู่กับวันที่ที่มีการเพิ่มศูนย์ (เช่น "08/08/2013") คุณสามารถดำเนินการดังนี้:

function parseDate(str) {
  function pad(x){return (((''+x).length==2) ? '' : '0') + x; }
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , matchesPadded = (d&&(str==[pad(d.getDate()),pad(d.getMonth()+1),d.getFullYear()].join('/')))
    , matchesNonPadded = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (matchesPadded || matchesNonPadded) ? d : null;
}

อย่างไรก็ตาม จะยังคงล้มเหลวหากวันที่เติมข้อมูลไม่สอดคล้องกัน (เช่น "8/08/2013")

person maerics    schedule 28.03.2011
comment
ความคิดดี! ปัญหาเดียวที่ฉันพบคือ '08/08/2013' จะไม่ผ่านการตรวจสอบความถูกต้องแบบ nonRolling เนื่องจากค่าศูนย์ - person Chris Haines; 02.08.2013
comment
ไม่จำเป็นต้องสร้างสตริงใหม่ แค่ d.getDate() == m[1] && d.getMonth() == m[2] && d.getFullYear() == m[3] - person Richard Ayotte; 24.05.2015
comment
/^(\d{1,2})\/(\d{1,2})\/(?:\d{4}|\d{2})$/ ... ฉันอยากจะผ่านวันที่ด้วย มีสองหรือ 4 หลัก ไม่มีอะไรพิเศษเพียงแค่เติมต่อท้าย (?:\d{4}|\d{2}) จากนั้นฉันก็ต้องการส่งวันที่ที่มียัติภังค์หรือแบ็กสแลช [/|-] ดังนั้นไวยากรณ์แบบเต็มจึงสิ้นสุดในลักษณะนี้... ^(\d{1,2})[/|-](\d{1,2 })[/|-](?:\d{4}|\d{2})$ - person Code Novice; 12.11.2020

ดูจากที่นี่ https://www.regextester.com/?fam=114662

ใช้รายละเอียดนิพจน์ทั่วไปต่อไปนี้ ซึ่งจะรองรับปีอธิกสุรทินด้วย

var 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])|(([1][26]|[2468][048]|[3579][26])00))))$/g;

ตัวอย่าง

person OammieR    schedule 11.02.2013
comment
มันใช้งานได้เหมือนมีเสน่ห์ ทดสอบวันที่จำนวนมากและใช้งานได้กับปีอธิกสุรทินและเดือนที่มี 30 หรือ 31 วัน - person peter; 27.04.2013
comment
น่าเสียดายที่สิ่งนี้ล้มเหลวหลายปีก่อนปี 1900 เช่น 01/01/1899 ล้มเหลว ฉันพลาดอะไรบางอย่างที่นี่หรือเปล่า? - person Anjana Silva; 23.06.2015
comment
จะเป็นอย่างไรหากฉันต้องการตรวจสอบรูปแบบ วว/ดด/ปปปป แทนที่จะเป็น ดด/วว/ปปปป - person Ne AS; 15.03.2017

สเคปสแลชเพียงใช้ \ ก่อน / และมันจะถูกหลีก (\/=› /)

มิฉะนั้นคุณอาจเป็น regex DD/MM/YYYY อาจเป็นรายการถัดไป:

/^[0-9]{2}[\/]{1}[0-9]{2}[\/]{1}[0-9]{4}$/g

คำอธิบาย:

  • [0-9]: แค่ตัวเลข
  • {2} หรือ {4}: ความยาว 2 หรือ 4 คุณสามารถทำ {2,4} ได้เช่นกันเพื่อความยาวระหว่างตัวเลขสองตัว (2 และ 4 ในกรณีนี้)
  • [\/]: ตัวละคร /
  • g : ทั่วโลก -- หรือ m: หลายบรรทัด (ไม่บังคับ โปรดดูข้อกำหนดของคุณ)
  • $: ยึดที่ส่วนท้ายของสตริง (ไม่บังคับ โปรดดูความต้องการของคุณ)
  • ^: จุดเริ่มต้นของสตริง (ไม่บังคับ โปรดดูความต้องการของคุณ)

ตัวอย่างการใช้งาน:

var regex = /^[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}$/g;

var dates = ["2009-10-09", "2009.10.09", "2009/10/09", "200910-09", "1990/10/09", 
    "2016/0/09", "2017/10/09", "2016/09/09", "20/09/2016", "21/09/2016", "22/09/2016",
    "23/09/2016", "19/09/2016", "18/09/2016", "25/09/2016", "21/09/2018"];

//Iterate array
dates.forEach(
    function(date){
        console.log(date + " matches with regex?");
      console.log(regex.test(date));
    });

แน่นอนคุณสามารถใช้เป็นบูลีนได้:

if(regex.test(date)){
     //do something
}
person Pau    schedule 20.09.2016
comment
การทดสอบครั้งแรกของคุณไม่ผ่าน - person mibbit; 09.01.2018
comment
มีวันที่ที่ถูกต้องหลายวันที่ไม่ผ่านการทดสอบ regExp ของคุณ - person Alex; 01.02.2018

ฉันใช้ฟังก์ชั่นนี้สำหรับรูปแบบ dd/mm/yyyy :

// (new Date()).fromString("3/9/2013") : 3 of september
// (new Date()).fromString("3/9/2013", false) : 9 of march
Date.prototype.fromString = function(str, ddmmyyyy) {
    var m = str.match(/(\d+)(-|\/)(\d+)(?:-|\/)(?:(\d+)\s+(\d+):(\d+)(?::(\d+))?(?:\.(\d+))?)?/);
    if(m[2] == "/"){
        if(ddmmyyyy === false)
            return new Date(+m[4], +m[1] - 1, +m[3], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
        return new Date(+m[4], +m[3] - 1, +m[1], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
    }
    return new Date(+m[1], +m[3] - 1, +m[4], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
}
person edid    schedule 23.09.2013

ลองใช้สิ่งนี้..

[0-9]{2}[/][0-9]{2}[/][0-9]{4}$

สิ่งนี้ควรจะใช้ได้กับรูปแบบนี้ DD/DD/DDDD โดยที่ D คือตัวเลขใดๆ (0-9)

person bkaancelen    schedule 17.08.2015
comment
ลองให้คำอธิบายกับ regexp ของคุณ - person arghtype; 17.08.2015

((?=\d{4})\d{4}|(?=[a-zA-Z]{3})[a-zA-Z]{3}|\d{2})((?=\/)\/|\-)((?=[0-9]{2})[0-9]{2}|(?=[0-9]{1,2})[0-9]{1,2}|[a-zA-Z]{3})((?=\/)\/|\-)((?=[0-9]{4})[0-9]{4}|(?=[0-9]{2})[0-9]{2}|[a-zA-Z]{3})

คอมไพล์ Regex ไว้

2012/22/Jan
2012/22/12 
2012/22/12
2012/22/12
2012/22/12
2012/22/12
2012/22/12
2012-Dec-22
2012-12-22
23/12/2012
23/12/2012
Dec-22-2012
12-2-2012
23-12-2012
23-12-2012
person user1693371    schedule 02.07.2015

หากคุณอยู่ใน Javascript อยู่แล้ว คุณไม่สามารถใช้ Date.Parse() เพื่อตรวจสอบวันที่แทนการใช้ regEx ได้ไหม

RegEx สำหรับวันที่นั้นเทอะทะและยากที่จะทำให้ถูกต้องโดยเฉพาะอย่างยิ่งในช่วงปีอธิกสุรทินและทั้งหมด

person Naraen    schedule 28.03.2011
comment
ฉันต้องการ regex เพราะฉันใช้ position-absolute.com/articles/ - person Juan Ignacio; 30.03.2011
comment
คุณช่วยอธิบายเพิ่มเติมได้ไหมเนื่องจากบทความนั้นมีขนาดใหญ่มาก? - person jwize; 21.04.2014
comment
ดูเหมือนว่า Date.parse จะไม่ทำงานกับรูปแบบวันที่แบบอังกฤษ (dd/mm/yyyy) บน Chrome ใช้ได้กับรูปแบบสหรัฐอเมริกาเท่านั้น (ดด/วว/ปปปป) - person Jeff S.; 10.03.2015

สำหรับผู้ที่ต้องการตรวจสอบความถูกต้องหลายปีก่อนปี 1900 การปฏิบัติตามควรทำดังนี้ จริงๆ แล้วนี่เหมือนกับคำตอบข้างต้นที่ให้ไว้โดย [@OammieR][1] แต่รวมปี 1800 - 1899 ด้วย

/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((18|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((18|[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))))$/

หวังว่านี่จะช่วยคนที่ต้องการตรวจสอบความถูกต้องก่อนปี 1900 เช่น 01/01/1855 เป็นต้น

ขอบคุณ @OammieR สำหรับแนวคิดเบื้องต้น

person Anjana Silva    schedule 23.06.2015

ทำการเปลี่ยนแปลงต่อไปนี้กับไฟล์ jquery.validationengine-en.js และอัปเดตการตรวจสอบความถูกต้องแบบอินไลน์ dd/mm/yyyy โดยรวมปีอธิกสุรทินด้วย:

"date": {
    // Check if date is valid by leap year
    "func": function (field) {
    //var pattern = new RegExp(/^(\d{4})[\/\-\.](0?[1-9]|1[012])[\/\-\.](0?[1-9]|[12][0-9]|3[01])$/);
    var pattern = new RegExp(/^(0?[1-9]|[12][0-9]|3[01])[\/\-\.](0?[1-9]|1[012])[\/\-\.](\d{4})$/);
    var match = pattern.exec(field.val());
    if (match == null)
    return false;

    //var year = match[1];
    //var month = match[2]*1;
    //var day = match[3]*1;
    var year = match[3];
    var month = match[2]*1;
    var day = match[1]*1;
    var date = new Date(year, month - 1, day); // because months starts from 0.

    return (date.getFullYear() == year && date.getMonth() == (month - 1) && date.getDate() == day);
},
"alertText": "* Invalid date, must be in DD-MM-YYYY format"
person Jayesh Bhalodia    schedule 13.03.2013

ฉันสร้างสิ่งนี้เป็นประจำเพื่อตรวจสอบเดือน 30/31 และปล่อยให้เดือนกุมภาพันธ์ถึง 29

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

ฉันคิดว่ามันง่ายกว่าและยืดหยุ่นกว่าและเต็มอิ่ม

บางทีส่วนแรกอาจเป็นสัญญาได้ แต่ฉันไม่พบอย่างถูกต้อง

person YannickIngenierie    schedule 04.09.2015

สิ่งนี้จะตรวจสอบวันที่เช่น dd-mm-yyyy

([0-2][0-9]|(3)[0-1])(\-)(((0)[0-9])|((1)[0-2]))(\-)([0-9][0-9][0-9][0-9])

สามารถใช้กับจาวาสคริปต์เช่นรูปแบบปฏิกิริยาเชิงมุม

person Visakh V A    schedule 17.11.2020