แพ็กเกจ 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;
}
}
รูปแบบวันที่อื่นๆ
| Format | Regex 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}$ |