Regex สำหรับจับคู่รูปแบบวันที่หลายรูปแบบ

สิ่งที่ควรเป็น regex สำหรับวันที่ที่ตรงกันของรูปแบบใด ๆ เช่น:

26FEB2009
31DEC2009

27 Mar 2008
30 Jul 2009

26-Feb-2009
27-Aug-2009

29/05/2008

07.11.2008

Jan 11 2008
May 26 2008

นิพจน์ทั่วไปสำหรับสิ่งนั้นควรเป็นอย่างไร?

ฉันมี regex ที่ตรงกับ 26-Feb-2009 และ 26 FEB 2009 แต่ไม่ตรงกับ 26FEB2009 ดังนั้นถ้าใครทราบก็กรุณาปรับปรุงด้วย

(?:^|[^\d\w:])(?'day'\d{1,2})(?:-?st\s+|-?th\s+|-?rd\s+|-?nd\s+|-|\s+)(?'month'Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[uarychilestmbro]*(?:\s*,?\s*|-)(?:'?(?'year'\d{2})|(?'year'\d{4}))(?=$|[^\d\w])

วันที่ 26FEB2009 เป็นสตริงย่อยของสตริงอื่นๆ เช่น FUTIDX 26FEB2009 NIFTY 0 และแยกวิเคราะห์จากหน้า html ดังนั้นฉันจึงไม่สามารถตั้งค่าช่องว่างหรือตัวคั่นได้


person Harikrishna    schedule 08.05.2010    source แหล่งที่มา


คำตอบ (2)


หากตรงกับวันที่ 26 กุมภาพันธ์ 2552 และไม่ใช่ 26 กุมภาพันธ์ 2552 ดูเหมือนว่าคุณจะต้องสร้างช่องว่างและอักขระตัวคั่น ("-" และ "/") ระหว่างแต่ละส่วนของวันที่หรือไม่ก็ได้

อักขระ + เมตาระบุหนึ่งตัวขึ้นไป ลองใช้ * (ศูนย์หรือมากกว่า) สำหรับช่องว่าง

แก้ไข

สิ่งที่ฉันหมายถึงคือ หากนิพจน์ทั่วไปของคุณจับคู่วันที่กับอักขระช่องว่าง/ตัวคั่น แต่ไม่ตรงกับวันที่โดยไม่มีอย่างใดอย่างหนึ่ง เช่น 26FEB2009 ดูเหมือนว่าคุณกำลังระบุว่าช่องว่าง/ตัวคั่นบังคับสำหรับการจับคู่ .

นี่คือสิ่งที่ฉันเคาะกันอย่างรวดเร็ว:

(\d{1,2})(\/|-|\s*)?((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)|\d{2})(\/|-|\s*)?(\d{4})

คุณอาจต้องการตรวจสอบว่าไม่ได้ขาดคุณสมบัติบางอย่างที่คุณต้องการ แต่มันตรงกับตัวอย่างทั้งหมดของคุณ

person Moonshield    schedule 08.05.2010
comment
@Moonshield วันที่ 26FEB2009 เป็นสตริงย่อยของสตริงอื่นเช่น FUTIDX 26FEB2009 NIFTY 0 และแยกวิเคราะห์จากหน้า html ดังนั้นฉันจึงไม่สามารถตั้งค่าช่องว่างหรือตัวคั่นได้ - person Harikrishna; 08.05.2010
comment
@Moonshield: เนื่องจากเดือนของเขาอาจเป็น Feb หรือ FEB ฉันจะแสดงรายการเดือนใน regex เป็นตัวพิมพ์เล็กทั้งหมด สตริงที่ทดสอบแล้วอาจเป็น .ToLower() - person IAbstract; 08.05.2010
comment
@ dboarman-FissureStudios: จุดดี วิดเจ็ตที่ฉันทดสอบ regex โดยเปิดใช้งานแบบคำนึงถึงขนาดตัวพิมพ์ - person Moonshield; 08.05.2010
comment
Sept ควรเป็น sep -- คุณควรแก้ไขคำตอบของคุณเพื่อแสดงวิธีแก้ปัญหาที่แม่นยำยิ่งขึ้น ;) - person IAbstract; 08.05.2010
comment
@Moonshield Regex ที่คุณกำหนดไว้ในคำตอบให้ข้อผิดพลาดเช่น Regex ไม่สมบูรณ์ - person Harikrishna; 10.05.2010
comment
@Harikrishna มันใช้งานได้กับผู้ทดสอบ regex ที่ฉันเคยใช้ หากคุณใช้สิ่งนี้ใน C # คุณอาจต้องหลีกเลี่ยงอักขระแบ็กสแลชแต่ละตัวในสตริง regex - person Moonshield; 10.05.2010

ฉันอยากจะแนะนำให้คุณไม่ใช้ regex สำหรับการแยกวิเคราะห์วันที่และแม้แต่การใช้ regex ในการแยกวิเคราะห์ HTML อย่างเด็ดขาด สำหรับการแยกวิเคราะห์วันที่ คุณอาจดูที่วิธี TryParseExact และสำหรับ แยกวิเคราะห์ HTML ตัวแยกวิเคราะห์ DOM เช่น Html Agility Pack:

var dateStr = "26FEB2009";
var formats = new[] 
{ 
    "ddMMMyyyy", "dd MMM yyyy", "dd/MM/yyyy"
};
DateTime date;
if (DateTime.TryParseExact(
    dateStr, 
    formats, 
    CultureInfo.InvariantCulture, 
    DateTimeStyles.NoCurrentDateDefault, 
    out date))
{
    // You have a match, use the date object
}
person Darin Dimitrov    schedule 10.05.2010
comment
@Darin Dimitrov มันเป็นวิธี inbuilt ใน .net หรือไม่ - person Harikrishna; 10.05.2010
comment
@Darin Dimitrov โอเค.. งั้นเราต้องกำหนดรูปแบบที่แตกต่างกันในพารามิเตอร์และวันที่ทั้งหมดที่เรากำหนดในพารามิเตอร์รูปแบบจะถูกจับคู่ ? มันเป็น dll โอเพ่นซอร์สหรือไม่? สามารถดาวน์โหลดได้จากที่ไหนครับ? - person Harikrishna; 10.05.2010
comment
หากคุณกำลังพูดถึงวิธี DateTime.TryParseExact ไม่มีอะไรให้ดาวน์โหลด มันมีอยู่ใน .NET แล้ว หากคุณกำลังพูดถึง Html Agility Pack ให้คลิกที่ลิงก์ในคำตอบของฉัน - person Darin Dimitrov; 10.05.2010
comment
@Darin Dimitrvo เราจะใช้ regex ที่นี่เพื่อจับคู่สตริงที่มีวันที่ได้อย่างไร - person Harikrishna; 10.05.2010