가능하면 ISO 8601을 사용해
입력 형식을 통제할 수 있다면 날짜는 YYYY-MM-DD, 날짜와 시간은 ISO 8601 형식으로 받아. 문자열의 기본 모양은 다음처럼 표현할 수 있어.
- 날짜:
\d{4}-\d{2}-\d{2} - 시간:
\d{2}:\d{2}:\d{2} - 날짜와 시간:
\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})?
모호한 형식은 정규식으로 해결할 수 없어
05/04/2026은 미국에서는 5월 4일이지만 다른 많은 지역에서는 4월 5일이야. 정규식은 어느 해석이 맞는지 알 수 없어. 입력 규칙을 ISO 8601로 정하거나, 허용할 형식과 지역을 명시해.
여러 형식을 꼭 받아야 한다면 각각의 형식을 별도 패턴으로 구분한 뒤 알맞은 파서에 넘겨.
1. ISO: \d{4}-\d{2}-\d{2}
2. 미국식 슬래시: \d{1,2}/\d{1,2}/\d{4}
3. 유럽식 점: \d{1,2}\.\d{1,2}\.\d{4}
4. 영문 월: (Jan|Feb|...)\s+\d{1,2},?\s+\d{4}
모양 검사와 날짜 검증은 달라
정규식은 형식만 검사하므로 2026-02-30도 매칭해. 실제로 존재하는 날짜인지는 Python의 datetime.strptime이나 Go의 time.Parse 같은 날짜 파서로 확인해야 해. JavaScript에서는 구성 요소를 파싱해 날짜를 만든 뒤 생성된 연·월·일이 입력과 같은지 비교하거나 엄격한 날짜 라이브러리를 사용해. !isNaN(new Date(s))만으로는 존재하지 않는 날짜가 다음 달로 정규화되는 경우를 놓칠 수 있어.
산문에서 날짜 후보 찾기
본문에서 날짜를 찾을 때는 \b(?:\d{4}-\d{2}-\d{2}|\d{1,2}/\d{1,2}/\d{4})\b처럼 허용할 모양을 좁혀서 추출해. 추출된 값은 다시 날짜 파서로 검증해야 해.