정규표현식: 날짜 형식 xxxx-xx-xx


날짜 형식(YYYY-MM-DD)을 검증하는 정규표현식입니다. 입력값 검증, 데이터 추출, 형식 변환 등에 활용됩니다.



언제 사용하나요?



  • 사용자 입력 날짜 형식 검증

  • 텍스트에서 날짜 추출

  • 로그 파일에서 날짜 패턴 찾기

  • 데이터 마이그레이션 시 형식 변환



기본 패턴


// 기본 YYYY-MM-DD 패턴
\\d{4}-\\d{2}-\\d{2}

// 예시 매칭
2024-01-15 ✓
2024-12-31 ✓
24-01-15 ✗ (년도 4자리 아님)
2024/01/15 ✗ (구분자 다름)


유효한 날짜 범위 검증


// 월: 01-12, 일: 01-31
^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$

// 분석
\\d{4} 년도 4자리
(0[1-9]|1[0-2]) 월 01-12
(0[1-9]|[12]\\d|3[01]) 일 01-31

// 예시
2024-01-15 ✓
2024-13-01 ✗ (13월 없음)
2024-02-31 ✓ (패턴상 통과, 실제 유효성은 별도 체크)


JavaScript 예시


// 날짜 형식 검증
function isValidDateFormat(dateStr) {
const regex = /^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$/;
return regex.test(dateStr);
}

isValidDateFormat("2024-01-15"); // true
isValidDateFormat("2024-1-15"); // false (1월은 01)
isValidDateFormat("2024/01/15"); // false

// 텍스트에서 모든 날짜 추출
const text = "회의: 2024-01-15, 마감: 2024-02-28";
const dates = text.match(/\\d{4}-\\d{2}-\\d{2}/g);
// ["2024-01-15", "2024-02-28"]

// 날짜 형식 변환 (YYYY-MM-DD -> DD/MM/YYYY)
const converted = "2024-01-15".replace(
/(\\d{4})-(\\d{2})-(\\d{2})/,
"$3/$2/$1"
);
// "15/01/2024"


Java 예시


import java.util.regex.*;

// 날짜 검증
String regex = "^\\\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\\\d|3[01])$";
Pattern pattern = Pattern.compile(regex);

String date = "2024-01-15";
Matcher matcher = pattern.matcher(date);
boolean isValid = matcher.matches(); // true

// 텍스트에서 날짜 추출
String text = "시작일: 2024-01-15, 종료일: 2024-12-31";
Pattern findPattern = Pattern.compile("\\\\d{4}-\\\\d{2}-\\\\d{2}");
Matcher findMatcher = findPattern.matcher(text);

while (findMatcher.find()) {
System.out.println(findMatcher.group());
}
// 2024-01-15
// 2024-12-31


다양한 날짜 형식


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

// YYYYMMDD (구분자 없음)
^\\d{4}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])$

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

// MM/DD/YYYY (미국식)
^(0[1-9]|1[0-2])/(0[1-9]|[12]\\d|3[01])/\\d{4}$

// 여러 형식 허용
^\\d{4}[-/](0[1-9]|1[0-2])[-/](0[1-9]|[12]\\d|3[01])$


시간 포함


// YYYY-MM-DD HH:MM:SS
^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]) ([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d$

// ISO 8601 형식
^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])T([01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?$


실제 날짜 유효성 검사


// JavaScript - Date 객체로 검증
function isValidDate(dateStr) {
const regex = /^(\\d{4})-(\\d{2})-(\\d{2})$/;
const match = dateStr.match(regex);

if (!match) return false;

const [, year, month, day] = match;
const date = new Date(year, month - 1, day);

return date.getFullYear() == year &&
date.getMonth() == month - 1 &&
date.getDate() == day;
}

isValidDate("2024-02-29"); // true (윤년)
isValidDate("2023-02-29"); // false (윤년 아님)
isValidDate("2024-04-31"); // false (4월은 30일까지)


SQL에서 활용


-- Oracle REGEXP_LIKE
SELECT * FROM orders
WHERE REGEXP_LIKE(order_date, "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$");

-- MySQL REGEXP
SELECT * FROM logs
WHERE date_column REGEXP "^[0-9]{4}-[0-9]{2}-[0-9]{2}$";


주의사항



  • 정규식만으로는 윤년, 월별 일수 검증 불가

  • 실제 유효성은 프로그래밍 언어의 Date 객체로 확인

  • 시간대(timezone) 처리는 별도 로직 필요