도전
가장 짧은 정규식을 찾으십시오.
- Proleptic Gregorian 달력 (1582 년에 처음 채택되기 전의 모든 날짜에도 적용됨)에서 가능한 모든 날짜를 확인하고 일치시킵니다.
- 유효하지 않은 날짜와 일치하지 않습니다.
산출
그러므로 결과는 진실되거나 거짓이다.
입력
입력은 3 가지 확장 된 ISO 8601 날짜 형식 중 하나로 시간이 없습니다.
처음 두 가지는 ±YYYY-MM-DD
(년, 월, 일)과 ±YYYY-DDD
(년, 일)입니다. 둘 다 도약의 날을 위해 특별한 케이스가 필요합니다. 이 확장 RX와는 별도로 순진하게 일치합니다.
(?<year>[+-]?\d{4,})-(?<month>\d\d)-(?<day>\d\d)
(?<year>[+-]?\d{4,})-(?<doy>\d{3})
세 번째 입력 형식은 ±YYYY-wWW-D
(년, 주, 일)입니다. 복잡한 도약 주간 패턴으로 인해 복잡한 것입니다.
(?<year>-?\d{4,})-W(?<week>\d\d)-(?<dow>\d)
세 가지 조합에 대한 기본이지만 불충분 한 유효성 검사는 다음과 같습니다.
[+-]?\d{4,}-((0\d|1[0-2])-([0-2]\d|3[01]) ↩
|([0-2]\d\d|3[0-5]\d|36[0-6]) ↩
|(W([0-4]\d|5[0-3])-[1-7]))
정황
윤년 예 기적 그레고리 안 달력에는 포함 윤일 …-02-29
따라서 그것은 따라서 366 일 긴하다 …-366
존재한다. 이는 서수를 4로 나눌 수 있지만 400으로 나눌 수있는 경우가 아니라면 100이 아닌
해에 발생 합니다.이 달력에 0 년이 있으며 윤년입니다.
ISO 주 달력 의 긴 연도 에는 53 주가 포함되며, 이는“ 윤리 주 ” 라고 할 수 있습니다. 이것은 1 월 1 일이 목요일 인 모든 년과 추가로 수요일 인 모든 윤년에 발생합니다. 일반적으로 5-6 년마다 불규칙적으로 보이는 것으로 나타났습니다.
1 년은 최소 4 자리 숫자입니다. 10 자리가 넘는 연도는 우주의 나이 (약 140 억 년)에 가깝기 때문에 지원할 필요가 없습니다. 실제 표준에 따르면 4 자리 이상의 숫자가 필요하지만 선행 더하기 부호는 선택 사항입니다.
일부 또는 잘린 날짜 (예 : 일 정밀도 미만)는 허용되지 않아야합니다.
날짜 표기의 일부 (예 : 월)는 참조 할 수있는 그룹과 일치 하지 않아도됩니다.
규칙
이것은 코드 골프입니다. 실행 된 코드가없는 가장 짧은 정규식이 이깁니다. 업데이트 : 재귀 및 균형 그룹과 같은 기능을 사용할 수 있지만 10을 곱하면 문자 수에 곱할 수 있습니다! 이것은 이제 Hard code golf : Regex for 7 의 규칙과 다릅니다 . 조기 답변이 동점입니다.
테스트 사례
유효한 테스트
2015-08-10
2015-10-08
12015-08-10
-2015-08-10
+2015-08-10
0015-08-10
1582-10-10
2015-02-28
2016-02-29
2000-02-29
0000-02-29
-2000-02-29
-2016-02-29
200000-02-29
2016-366
2000-366
0000-366
-2016-366
-2000-366
2015-081
2015-W33-1
2015-W53-7
2015-08-10
마지막 것은 선택적으로 유효합니다. 즉, 입력 문자열의 선행 및 후행 공백이 잘릴 수 있습니다.
잘못된 형식
-0000-08-10 # that's an arbitrary decision
15-08-10 # year is at least 4 digits long
2015-8-10 # month (and day) is exactly two digits long, i.e. leading zero is required
015-08-10 # year is at least 4 digits long
20150810 # though a valid ISO format, we require separators; could also be interpreted as a 8-digit year
2015 08 10 # separator must be hyphen-minus
2015.08.10 # separator must be hyphen-minus
2015–08–10 # separator must be hyphen-minus
2015-0810
201508-10 # could be October in the year 201508
2015 - 08 - 10 # no internal spaces allowed
2015-w33-1 # letter ‘W’ must be uppercase
2015W33-1 # it would be unambiguous to omit the separator in front of a letter, but not in the standard
2015W331 # though a valid ISO format we require separators
2015-W331
2015-W33 # a valid ISO date, but we require day-precision
2015W33
유효하지 않은 날짜
2015 # a valid ISO format, but we require day-precision
2015-08 # a valid ISO format, but we require day-precision
2015-00-10 # month range is 1–12
2015-13-10 # month range is 1–12
2015-08-00 # day range is 1–28 through 31
2015-08-32 # max. day range is 1–31
2015-04-31 # day range for April is 1–30
2015-02-30 # day range for February is 1–28 or 29
2015-02-29 # day range for common February is 1–28
2100-02-29 # most century years are non-leap
-2100-02-29 # most century years are non-leap
2015-000 # day range is 1–365 or 366
2015-366 # day range is 1–365 in common years
2016-367 # day range is 1–366 in leap years
2100-366 # most century years are non-leap
-2100-366 # most century years are non-leap
2015-W00-1 # week range is 1–52 or 53
2015-W54-1 # week range is 1–53 in long years
2016-W53-1 # week range is 1–52 in short years
2015-W33-0 # day range is 1–7
2015-W33-8 # day range is 1–7