Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธี Validate รูปแบบวันที่ MM-DD-YYYY ด้วย Regex ใน Java

แพ็กเกจ java.util.regex มีคลาส Pattern (compiled regex) และ Matcher (engine สำหรับ match operation)

Regex สำหรับ MM/DD/YYYY


^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/[0-9]{4}$

รายละเอียด:

  • ^ - เริ่มสตริง
  • (1[0-2]|0[1-9]) - เดือน 01-12
  • / - separator
  • (3[01]|[12][0-9]|0[1-9]) - วัน 01-31
  • / - separator
  • [0-9]{4} - ปี 4 หลัก
  • $ - จบสตริง

ตัวอย่างโค้ด


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ValidateDateFormat {
    private static final Pattern DATE_PATTERN = Pattern.compile(
        "^(1[0-2]|0[1-9])/(3[01]|[12][0-9]|0[1-9])/[0-9]{4}$"
    );
    
    public static void main(String[] args) {
        String[] testDates = {
            "01/12/2019",  // valid
            "12/31/2020",  // valid
            "13/01/2019",  // invalid month
            "02/30/2019",  // invalid day (Feb 30)
            "1/1/2019",    // invalid format (no leading zero)
            "01-12-2019",  // invalid separator
            "01/12/19"     // invalid year (2 digits)
        };
        
        for (String date : testDates) {
            Matcher matcher = DATE_PATTERN.matcher(date);
            boolean valid = matcher.matches();
            System.out.printf("%-12s -> %s%n", date, valid ? "Valid" : "Invalid");
        }
    }
}

ผลลัพธ์


01/12/2019   -> Valid
12/31/2020   -> Valid
13/01/2019   -> Invalid
02/30/2019   -> Invalid (format valid แต่วันที่ไม่มีจริง)
1/1/2019     -> Invalid
01-12-2019   -> Invalid
01/12/19     -> Invalid

ข้อจำกัดของ Regex Validation

Regex ตรวจสอบ รูปแบบ (format) เท่านั้น ไม่ตรวจสอบ ความถูกต้องของวันที่ (เช่น 02/30, 04/31)

วิธี Validate วันที่จริง (Semantic Validation)


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class ValidateRealDate {
    private static final DateTimeFormatter FORMATTER = 
        DateTimeFormatter.ofPattern("MM/dd/yyyy");
    
    public static boolean isValidDate(String dateStr) {
        try {
            LocalDate.parse(dateStr, FORMATTER);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }
    
    public static void main(String[] args) {
        String[] tests = {"02/28/2019", "02/29/2019", "02/29/2020", "04/31/2019"};
        for (String d : tests) {
            System.out.println(d + " -> " + (isValidDate(d) ? "Valid" : "Invalid"));
        }
    }
}

ผลลัพธ์


02/28/2019 -> Valid
02/29/2019 -> Invalid (2019 ไม่ใช่ leap year)
02/29/2020 -> Valid (2020 leap year)
04/31/2019 -> Invalid (เมษายนมี 30 วัน)

แนะนำ: ใช้ร่วมกัน


public static boolean isValidDateFormatAndValue(String dateStr) {
    // 1. เช็ครูปแบบเร็วด้วย regex
    if (!DATE_PATTERN.matcher(dateStr).matches()) return false;
    
    // 2. เช็คความถูกต้องของวันที่ด้วย LocalDate
    try {
        LocalDate.parse(dateStr, FORMATTER);
        return true;
    } catch (DateTimeParseException e) {
        return false;
    }
}

รูปแบบวันที่อื่นๆ

FormatRegex Pattern
DD-MM-YYYY^(3[01]|[12][0-9]|0[1-9])-(1[0-2]|0[1-9])-[0-9]{4}$
YYYY-MM-DD^[0-9]{4}-(1[0-2]|0[1-9])-(3[01]|[12][0-9]|0[1-9])$
DD/MM/YYYY^(3[01]|[12][0-9]|0[1-9])/(1[0-2]|0[1-9])/[0-9]{4}$