2010-01-22 4 views
1

날짜 부분의 날짜와 날짜를 맞추기 위해 어떻게 정규 표현식을 수정할 수 있습니까? 이 정규 표현식은 "2003 년 1 월 1 일 | 2004 년 2 월 29 일 | 3202 년 11 월 2 일"과 일치하지만 "2003 년 1 월 1 일 | 2004 년 2 월 29 일 | 3202 년 11 월 2 일 | 2010 년 3 월 3 일""st", "nd", "rd", "th"와 날짜를 맞추기 위해 regex 수정

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))))\,\ ((1[6-9]|[2-9]\d)\d{2})) 

고맙습니다.

+0

영어로만 생각하니? –

+1

Ma (r (ch)? | y)가 Mary와 일치합니다. 원하는 동작입니까? :) –

+2

이고르, 아니, 그렇지 않아. 파이프는 "r (ch)"전체 사이에 있습니다. 및 "y". "r", "rch"또는 "y"와 일치합니다. –

답변

4

이것은 유스 케이스에 따라 다르지만 실용주의의 측면에서 일치하는 항목과 일치하는 항목은 다음과 같습니다.
(1) 모든 월 이름 또는 약자.
(2) 공백;
(3) 한 자리 또는 두 자리;
(4) 공백;
(5) 임의의 st, nd, rd, th;
(6) 공백 또는 쉼표 + 선택적 공백.
(7) 4 자리 숫자;

나는 당신이 일치하는지 모르겠지만, 내가 Jan 35nd,3001이 있다면, 나는 오히려 캡처 지금하고 나중에 바로 얻을 - 이동에 그것을 건너 뛸 것보다 그것을 무효화 거라고 생각합니다.

또한, 데이터 세트에 따라 1 Jan 2004 또는 1st Jan, 2004 또는 January, 2004 같은 대소 문자 구분 문제와 일반적인 국제 영어 변종을 고려 등

줄 바꿈

^(?:j(?:an(?:uary)?|un(?:e)?|ul(?:y)?)?|feb(?:ruary)?|ma(?:r(?:ch)?|y) 
|a(?:pr(?:il)?|ug(?:ust)?)|sep(?:t|tember)?|oct(?:ober)?|(?:nov|dec)(?:ember)?) 
\s+\d{1,2}(?:st|nd|rd|th)?(?:\s+|,\s*)\d{4}\b 

더욱 실용적인을 (추가 및 읽기 가능) 매우 기괴한 데이터 세트가 아니라면 일반적인 접두사 뒤에 아무 것도 허용하는 것입니다.

(?:jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)[a-z]*?\s+\d{1,2}(?:[a-z]{2})?(?:\s+|,\s*)\d{4}\b 

이 내용이 octagenarianism 99xx, 0000과 일치합니까? 예. 그게 문제가 될 가능성이 있습니까? 나는 그것을 의심한다.

+0

나는 당신과 동의합니다. 나는 정규식에 대해 아무것도 모른다. 그래서 내가 찾은 샘플을 의지해야했다. http://regexlib.com/RETester.aspx에 대해 샘플을 테스트했는데 2020 년 1 월 20 일과 일치하지 않습니다. – IEnumerator

+0

죄송합니다. 일부 펄 정규 표현식 메타 문자가 있습니다. .NET 맛을 맞추기 위해 편집했습니다. – Jay

+0

감사합니다. 훌륭하게 작동합니다. – IEnumerator

2

그 정규식은 너무 많이하고 있습니다. 귀하의 언어를 strptime()과 동등하게 사용하는 것이 훨씬 낫습니다. 그러나, 정규 표현식은 다음과 서수와 일치합니다 : 그것은 또한 "월 20nd"하지만 실제 데이터에 대부분의 경우에 배려를 귀찮게 너무 낮다는 것을 발생의 가능성 같은 것들과 일치 것

^(?:(((Jan(uary)?|Ma(r(ch)?|y)|Jul(y)?|Aug(ust)?|Oct(ober)?|Dec(ember)?)\ 31(st)?)|((Jan(uary)?|Ma(r(ch)?|y)|Apr(il)?|Ju((ly?)|(ne?))|Aug(ust)?|Oct(ober)?|(Sept|Nov|Dec)(ember)?)\ (0?[1-9]|([12]\d)|30))(st|nd|rd|th)?|(Feb(ruary)?\ (0?[1-9]|1\d|2[0-8]|(29(th)?(?=,\ ((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00)))))(st|nd|rd|th)?))\,\ ((1[6-9]|[2-9]\d)\d{2})) 

참고.

+0

나는 당신의 대답을 좋아하고 그것이 작동하는 동안, 나는 그것이 더 작았 기 때문에 Jay의 정규식을 골랐다. 둘 다 올바른 것으로 선택할 수 있기를 바랍니다. – IEnumerator