2009-09-03 5 views
0

이 정규 표현식 패턴 :도움말 단순화 나는 다음과 같은 문자열에 일치하는이 정규 표현식이

<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?:(?: ?\d{2}:?){3}?(?: ?[aApP][mM]?)?)? ---> 

업데이트 패턴, twistol 당 :

다음

<!-- 09-02-2009 ---> 
<!-- 09-02-2009 12:00:00 ---> 
<!-- 09-02-2009 12:00:00 A ---> 
<!-- 09-02-2009 12:00:00 AM ---> 

는 패턴이다

<!-- (?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4}?)(?<time>(?: ?(?:\d{2}:){2}\d{2})?(?: ?[aApP][mM]?)?)? ---> 

이 pa를 단순화하기 위해 할 수있는 일이 있습니까? ttern?

감사합니다.

편집 여기

입니다 내가 내장 된 모든 댓글/답변, 플러스 유효성 검사를 함께했다. 그것은 조금 추한이지만, 누가 정규식 꽤 할 필요가 말했다 패턴? : P

<!-- (?<month>(?:0[1-9]|1[0-2]))-(?<day>(?:0[1-9]|1[0-9]|2[0-9]|3[01]))-(?<year>\d{4})(?<time> (?:0[0-9]|1[0-9]|2[0-3]):(?:[0-5][0-9])(?::[0-5][0-9])?(?: [aApP][mM]?)?)? ---> 

그것은 다음과 같은 형식으로 유효한 날짜와 일치합니다 : 내가 생각할 수있는

<!-- 09-02-2009 ---> 
<!-- 09-02-2009 12:00 ---> 
<!-- 09-02-2009 12:00 A ---> 
<!-- 09-02-2009 12:00 AM ---> 
<!-- 09-02-2009 12:00:00 ---> 
<!-- 09-02-2009 12:00:00 A ---> 
<!-- 09-02-2009 12:00:00 AM ---> 
+1

어떤 정규 표현식을 사용하는지에 따라 다릅니다. Perl, JS 등 – pavium

+1

내가 단순화하는 데 도움이 될 수는 없지만이 비트가 "11:11:11 :"과 일치하지는 않습니까? (? :? \ d {2} :?) {3}? ' – Twisol

+0

미안하지만, C# 프로젝트에서 사용하고 있습니다. – Anders

답변

3
<!-- (?<month>\d\d)-(?<day>\d\d)-(?<year>\d{4})(?: \d\d:\d\d:\d\d(?: [aApP][mM]?)?)? --> 

은 간단합니다. 원래이 타임 스탬프 콜론은 모두 선택 사항 이었기 때문에 01 : 0203 또는 0102 : 03 : 등과 같이 일치 할 것이기 때문에이 정규식은 정확히 동일하지 않습니다. 제 버전이 더 정확할 수도 있습니다.

기본적으로 숫자를 두 배로 늘릴 때 더 많은 읽기 쉽지 않은 읽기 쉽지 않은 모든 비 캡처 그룹과 수량 한정 기호를 제거했습니다. 또한 양화 기호에 대한 탐욕 수정자를 제거했습니다. 탐욕의 유무에 관계없이 항상 정확히 2 ~ 4 개 또는 그와 일치 할 것이기 때문입니다.

물론 이것은 유효하지 않은 날짜 (예 : 13-32-0000)와 일치합니다. 이를 해결하기 위해서는 복잡하지만 정확한 솔루션이 단순하고 이해하기 쉬운 솔루션보다 더 바람직한지 여부를 결정해야합니다. 기본적으로, 이것은 당신이 이것을 실행할 텍스트에 대한 자신감에 달려 있습니다. 필터링하려는 가양 성이있을 확률이 높으면 가독성이 약간 떨어지더라도 더 정확한 해법을 찾으십시오.

다음
+0

고마워, 네가 그곳에서 한 짓을 내가 안다. 필자는 annakata가 OP 주석 아래에서 지적했듯이이 패턴을 수정하여 유효한 날짜 값을 허용하려고 시도 할 것입니다. – Anders

+0

원래 예제의 대부분이 포함되어 있기 때문에 -> (2 개의 대시)가 아닌 ---> (3 개의 대시)에 대해서만 원본과 원본 모두 일치하지 않습니까? – Twisol

+0

@Twistol - 죄송합니다. 세 번째 대시를 잊어 버렸습니다. 그 유형입니다 : ( – Anders

0

필자는 ...

(?<month>\d{2}?)-(?<day>\d{2}?)-(?<year>\d{4})(?:\s\d{2}:\d{2}:\d{2}\s?[aApP]?[mM]?)? 

는 어떤 짧게 수없는 것.

+0

이 값은 원본보다 많은 잘못된 데이터와 일치합니다 (예 : 시간 부분은 01 : 02 : 03M 일 수 있음). 왜냐하면 공백 문자와/p 문자는 모두 m에 대해 독점적으로 선택적이기 때문입니다. – Sean

관련 문제