2017-12-20 15 views
-1

나는 문자열이 유효한 날짜인지, 나를 위해 점검이 다음 (작업) 정규식, 한 :정규식 날짜 + 시간이 작동하지 않지만 그 이유는 무엇입니까?

(?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(-)(?:0?2\1(?:29)))|(?:(?:[1-9]\d{3})(-)(?:(?:(?:0?[13578]|1[02])\2(?:31))|(?:(?:0?[13-9]|1[0-2])\2(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))\2(?:0?[1-9]|1\d|2[0-8]))))) 

그것은 다음과 같습니다 날짜를 작동합니다 07.12.2017

지금 내가 원하는 문자열에 또한 정확성을 검사하는 시간이 있다고 덧붙입니다. 07.12.2017, 06:13의 유효성을 검사하고 싶습니다.

나는 이전 정규식 (위)이 식에 추가 :

, ([0-1]?[0-9]|2[0-3]):[0-5][0-9] 

그러나 그것은 작동하지 않습니다. 아무도 내가 잘못했음을 지적 할 수 있습니까?

+0

당신이 사용하는 언어는 무엇? 그 문맥은 무엇입니까? 예를 들어 파이썬을 사용한다면 정규 표현식을 사용하지 않고 (그리고 까다로운 오류를 수정하지 않고) 이것을 할 수 있습니다. – Arount

+0

js를 사용하기 때문에 필요합니다. – Madness

+0

frontend? 백엔드? 어떤 맛? – Arount

답변

0

나는 이것을 대답하기 전에 2 월이 올바른 달이 아니기 때문에 정규식을 사용하는 것 이외에도 이것을 검증하는 더 좋은 방법이 있다고 말하고 싶다. 몇 년은 28 일을, 다른 것은 그것을 쓸 것이다. 29 일을 가질 것이며, "2 월 4 일마다 29 일을 가질 것"처럼 간단하지도 않습니다. 2100 년, 당신은이 핑계로 윤년이 될 것으로 기대하지만, 그것은 400으로 나눌 수 없기 때문에 아닙니다.

실제 날짜 라이브러리를 사용하는 것이 더 낫습니다. 많은 변수가 날짜에 관해서는, 정규식은 단순히 나쁜 도구가 될 것입니다. 이것은 당신이에 원하는 형식으로 날짜와 일치해야합니다

(?:(?:(?:[0-2]\d)\.(?:0\d|1[12]))|(?:30\.(?:0[469]|11))|(?:3[01]\.(?:0[13578]|1[02])))\.\d+(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$

: 비켜 그와

, 여기에 내 대답이다.

은 그냥 더 나은이하는 기능을 제공하기 위해 정규식과 장난을 조금했다

편집Regex101

작업을 참조하십시오. 이 함수는 윤년을 두 번 확인하고 날짜가 유효한지 여부에 대한 부울을 반환합니다.

function isValidDate(date) { 
 
    let regex = /^(?:((?:[0-2]\d)\.(?:0\d|1[12]))|(30\.(?:0[469]|11))|(3[01]\.(?:0[13578]|1[02])))\.(\d+)(?:, (?:[01]\d|2[0-4])\:[0-5]\d)?$/, 
 
    matches = date.match(regex); 
 

 
    if (!matches) { 
 
    return false; 
 
    } 
 

 
    let dayMonth = matches[1] || matches[2] || matches[3], 
 
    year = matches[4], 
 
    valid = !dayMonth || !year ? false : true; 
 

 
    if (dayMonth == "29.02") { 
 
    let divisibleBy = {four: year % 4 === 0, oneHundred: year % 100 === 0, fourHundred: year % 400 === 0 }; 
 
    if (year > 400) { 
 
     if (!divisibleBy.four) { 
 
     valid = false; 
 
     } 
 
     if (divisibleBy.four && divisibleBy.oneHundred && !divisibleBy.fourHundred) { 
 
     valid = false; 
 
     } 
 
    } 
 
    } 
 
    return valid; 
 
} 
 

 
console.log(
 
    isValidDate("29.02.2100"), 
 
    isValidDate("29.02.2000"), 
 
    isValidDate("25.12.2017, 22:00"), 
 
    isValidDate("31.05.1678"), 
 
    isValidDate("32.05.1900"), 
 
    isValidDate("29.02.32000, 06:15") 
 
)