2010-11-27 8 views
3

asp.net asp : RegularExpressionValidator와 함께 작동하는 정규 표현식에 대한 도움이 필요합니다. 정규 표현식은 MMddyy 형식으로 날짜의 유효성을 검사합니다. 우리가 직면 한 문제는 윤년입니다. 문제는 정규 표현식을 통해 02/29/2008이 유효한 날짜이지만 02/29/2010이 유효한 날짜가 아니기 때문에 유효한 윤년 만 허용한다는 것을 확인할 수 있다는 것입니다.asp에 대한 정규 표현식 : MMddyy 형식의 정규 표현식 검증 자 (윤년 문제)

"asp : RegularExpressionValidator"와 함께 작동하는 정규 표현식은 무엇입니까?

+0

mmddyy 또는 mm/dd/yy 또는 mm/dd/yyyy입니까? 다른 요구 사항은 무엇입니까? 1792 년 1 월 1 일 유효합니까? 9/9/99 또는 9/09/9999는 어때요? 그것이 mmddyy라면, 1900 년대와 2000 년대 사이의 컷오프는 어디입니까? –

+0

@Tim : 해당 mm/dd/yyyy. 타당성을 위해 아직 구체적인 요구 사항이 없다고 생각합니다. 컷오프 없음. – Malik

답변

15

좋아요, 당신은 정규식을 요구했습니다. 여기있어. 경우,

^  # start of string 
(?:  # either match... 
(?: 
    (?: # 31st day of all allowed months 
    (?:(?:0?[13578]|1[02])/31) 
    | # or 
    (?:(?:0?[13-9]|1[0-2])/(?:29|30)) 
)  # 29th/30th day of any month except February 
/ # plus any year since 1600 
    (?:1[6-9]|[2-9]\d) 
    \d{2} 
) 
|  # or 
(?: # match Feb 29th 
    0?2/29/ 
    (?: # in all leap years since 1600 
    (?: 
    (?: # century 
    1[6-9]|[2-9]\d 
    ) 
    (?: # two-digit years divisible by four, not ending in 00 
    0[48] 
    | 
    [2468][048] 
    | 
    [13579][26] 
    ) 
    | 
    (?: # all the leap years ending in 00 
    (?:16|[2468][048]|[3579][26]) 
    00 
    ) 
    ) 
) 
) 
|  # or 
(?: # (for any month) 
    (?:0?[1-9]) 
    | 
    (?:1[0-2]) 
) 
/
(?: # match the 1st-28th day 
    0?[1-9]|1\d|2[0-8] 
) 
/
(?: 
    (?:1[6-9]|[2-9]\d)\d{2} 
) 
)$ 

또는 적어도 가능한이 짐승을 이해하려면 버전 댓글을 달았습니다,

첫째, 자세한 : 나는 정규 표현식과 날짜를 확인하는 것은 좋은 생각이 아닌 이유 즉시 분명 생각

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

이 허용하지만, 한 자리 개월/일 앞에 0을 필요로하지 않는 : 당신은 ASP.NET이 유효성 검사기에서 자세한 정규 표현식에 사용할 수 없습니다. 이를 원하지 않으면 0?의 모든 인스턴스를 0으로 바꿉니다.

+0

+1 만약 작동한다면! 정말 그걸 작성하지 않았 으면 좋겠습니다. regex 그리고 이전에 만든 것입니다! –

+0

regexlib.com에서 찾은 것에서 이전에 수정 한 예전의 것을 다시 작성했습니다. 그런 식으로는 쓰지 않을 것입니다. :) 그렇습니다. 적어도 작동합니다. machine (tm). –

+0

도움을 많이 주셔서 감사합니다.이 시도해보십시오 :) – Malik

1

윤년을 확인하는 논리가 필요하므로 CustomValidator을 사용해보십시오. 저는 이것을 비교적 빨리 정리해 봤지만 잘하면 당신은 그 아이디어를 얻을 수 있습니다.

protected void dateFormatValidator_ServerValidate(object source, ServerValidateEventArgs args) 
{ 
    if (args.Value.Length == 6) 
    { 
     var month = args.Value.Substring(0, 2); 
     var day = args.Value.Substring(2, 2); 
     var year = args.Value.Substring(4, 2); 

     DateTime dummyValue; 
     args.IsValid = DateTime.TryParse(month + "/" + day + "/" + year, out dummyValue); 
    } 
    else 
    { 
     args.IsValid = false; 
    } 
} 
+0

답장을 보내 주셔서 감사 합니다만 서버 측은 옵션이 아닙니다 : ( – Malik

2

서버 측 옵션이없는 경우 JavaScript를 사용해야합니다. 게시 된 코드를 시도하고 here 설명. 2010 년 2 월 29 일이 유효하지 않으며 02/29/2008이 유효하다고 판단됩니다. 필요한 경우 CustomValidator를 사용하여 JavaScript 함수를 호출하십시오.

0

bitwise는 clientside JS가이 일을하는 방법이라고 말하면서 톰이 생각 나게하는 끔찍한 정규 표현이 아닙니다. 내 작업 기계에 깔끔한 날짜 검사기가 있는데 월요일에 게시 할 것입니다.

앱에서 유효성 검사에 실패한 문제가 발생하는 경우 해당 정규식을 해독하려고하는 악몽을 상상할 수 있습니까?