2010-06-03 5 views
-1

프로젝트에 대한 두 개의 Regex 문 작성에 도움이 필요합니다. 우리가 사용하는 소프트웨어는 유효성 검사를 위해 Regex 만 허용합니다.날짜 범위 <= 4/1/2009 및 <= 10/01/2009에 대한 Regex 문

나는 어떤 일 < 2009년 4월 1일

및 날짜에 대한 화재는 < 2009년 10월 1일

내 동료가 나에게 다음 코드를 준 초 동안 발사 하나가 필요합니다 < = 2010 년 10 월 1 일을 확인하십시오. 그러나 윤년과 그 모든 것들을 점검합니다. MM/DD/YYYY 형식으로 이보다 조금 더 간소화 된 것이 필요합니다. 미리 감사드립니다!

^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:2[0-9][2-9][0-9])$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:201[1-9])$|^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)))(\/|-|\.)(?:201[1-9])$|^(?:(?:(?:11)(\/|-|\.))(?:0?[1-9]|1\d|2[0-9]|30)(\/|-|\.))(2010)$|^(?:(?:(?:10|12)(\/|-|\.))(?:0?[1-9]|1\d|2[0-9]|30|31)(\/|-|\.))(2010)$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:2[0-9][2-9][0-9])$|^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)))(\/|-|\.)(?:2[0-9][2-9][0-9])$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:2011)$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:2[0-9][1-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$

+1

과거로 되돌아 가려면 얼마나 걸릴 수 있어야합니까? 20 세기? 중세? 그리스도 앞에서? –

+0

Tim이 말한 것에 꼬리표를 달기 위해 윤년을 확인하고 싶지 않은 특별한 이유가 있습니까? 제한된 범위를 허용하는 날짜에는 어떤 의미가 있습니까? 앞으로 표현식이 업데이트 될 예정입니까? (예 : 2011 년에 한 번 돌아서 2010 년 날짜를 확인하십시오.) – GalacticCowboy

+0

또한 <= 또는

답변

1
^(?:(?:0?2/(?:[12][0-9]|0?[1-9])|0?[13]/(?:3[01]|[12][0-9]|0?[1-9]))/2009|(?:0?2/(?:[12][0-9]|0?[1-9])|(?:0?[469]|11)/(?:30|[12][0-9]|0?[1-9])|(?:0?[13578]|1[02])/(?:3[01]|[12][0-9]|0?[1-9]))/(?:200[0-8]|19[0-9]{2}))$ 

는 윤년 무시하지만, 그 밖에는 유효 날짜와 일치, 1900 년과 2009년 3월 31일 사이의 날짜와 일치한다;

^(?:(?:0?2/(?:[12][0-9]|0?[1-9])|0?[469]/(?:30|[12][0-9]|0?[1-9])|0?[13578]/(?:3[01]|[12][0-9]|0?[1-9]))/2009|(?:0?2/(?:[12][0-9]|0?[1-9])|(?:0?[469]|11)/(?:30|[12][0-9]|0?[1-9])|(?:0?[13578]|1[02])/(?:3[01]|[12][0-9]|0?[1-9]))/(?:200[0-8]|19[0-9]{2}))$ 

은 1/1/1900-9/30/2009와 동일합니다.

편집 : "발사"는 질문에 "일치하지 않음"을 의미합니다. 그래서

^(?:(?:(?:0?[469]|11)/(?:30|[12][0-9]|0?[1-9])|(?:0?[578]|1[02])/(?:3[01]|[12][0-9]|0?[1-9]))/2009|(?:0?2/(?:[12][0-9]|0?[1-9])|(?:0?[469]|11)/(?:30|[12][0-9]|0?[1-9])|(?:0?[13578]|1[02])/(?:3[01]|[12][0-9]|0?[1-9]))/(?:[3-9][0-9]{2}|2[1-9][0-9]|20[1-9])[0-9])$ 

는 이후 2009년 4월 1일에서 모든 날짜와 일치하며,

^(?:(?:11/(?:30|[12][0-9]|0?[1-9])|1[02]/(?:3[01]|[12][0-9]|0?[1-9]))/2009|(?:0?2/(?:[12][0-9]|0?[1-9])|(?:0?[469]|11)/(?:30|[12][0-9]|0?[1-9])|(?:0?[13578]|1[02])/(?:3[01]|[12][0-9]|0?[1-9]))/(?:[3-9][0-9]{2}|2[1-9][0-9]|20[1-9])[0-9])$ 

는 이후 2009년 10월 1일에서 모든 날짜와 일치합니다.

모든 정규 표현식은 RegexMagic을 사용하여 생성되었습니다.

+0

MM/DD/YYYY가 아닌 DD/MM/YYYY 형식임을 유의하십시오. 그래서 당신은 몇 가지 것들을 뒤집어 써야 할 것입니다. – GalacticCowboy

+0

와우. 감사합니다 @ GalacticCowboy. 고쳤다. –

+0

위의 거대한 정규 표현식이 거부하려고 시도하는 "2/29/1985"와 같은 무의미한 날짜도 허용한다는 점에 유의하십시오. – Ken