2013-04-25 3 views
2

C#에서 정규 표현식을 처음 접했습니다. 내 손을 잡아서 로그에서 날짜 값을 추출하는 정규식을 찾으려고 노력했습니다. 이것은 내가 사용하고있는 것입니다 :RegEx.Match가 예상 한 문자열을 반환하지 않습니다.

value = Regex.Match("abc 2012‎-‎12‎-‎23 01:13:51.253", 
        @"\b20[0-9][0-9]‎-[0-1][0-9]‎-‎[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9].\d+") 
      .Value; 

그러나 나는 값어치가 있습니다. 누군가 내가 뭘 잘못하고 있는지에 관해서 나를 도울 수 있습니까?

미리 감사드립니다. 당신은 그냥 정규 표현식에 배우고 싶은 경우

+2

날짜 문자열을 일치 시키려고합니까? 왜'DateTime.ParseExact'를 사용하지 않습니까? –

+0

예. 저는 그렇게하려고합니다. 그러나 문제는 날짜가 올 줄 각 문자의 문자 수 이후에 잘 정의되어 있지 않다는 것입니다. 그래서 캔트 DateTime.ParseExact에 정의 된 입력을 제공 –

+0

내 대답을 참조하십시오. 형식 문자열을 사용하는 방법을 설명했습니다. –

답변

5

문제는 매우 미묘합니다. 검색 문자열에 숨겨진 제어 문자가 있습니다. 각 하이픈의 앞뒤에는 0x200e 또는 왼쪽에서 오른쪽 문자가 있습니다. 나는 당신의 코드를 복사하고 바이트들을 검사함으로써 이것을 확인했다. 커서를 - 앞에 놓고 백 스페이스 키를 눌러 테스트 할 수도 있습니다.

패턴 문자열에도 첫 번째 하이픈 앞과 두 번째 하이픈 앞뒤에 숨겨진 제어 문자가 포함되어 있습니다.

일단 검색 문자열과 패턴 문자열에서이 문자의 모든 인스턴스를 제거하면 패턴이 올바르게 일치합니다.

다른 작업을 시도하기 전에 입력에서 이러한 문자를 제거하는 것이 가장 좋습니다. 이것은 RegEx 또는 기존의 DateTime 구문 분석에서 다른 사람이 제안한대로 적용됩니다. 당신이 DateTime.ParseExact를 사용하여 문자열과 일치 할 수있는 방법

다음
input = input.Replace(char.ConvertFromUtf32(0x202e).ToString(), string.Empty); 
+0

감사합니다 .p.sw. 이것은 문제인 것처럼 보입니다. 이러한 상황에서 정규 표현식을 일반화하면 어떻게 그러한 문자를 피할 수 있습니까? 아니면 다른 접근법을 따라야합니까? –

+0

글쎄, 그 글자를 입력하기 전에 필자의 글자를 걸러 내고 싶을 것이다. 이는 날짜를 구문 분석하는 방법에 관계없이 적용됩니다. –

+0

+1, 좋은 캐치! – AlexFoxGill

0

, 당신은 사용할 수 있습니다

@"(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(((0[1-9])|(1[0-2]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)" 

그것을 응용 프로그램에 대한 올바른 사용 사례의 경우에, 당신은 이하는 DateTime 객체로를을 파싱 사용되어야한다 DateTime.ParseExact과 같은 것입니다.

0

이야 : 이것은 당신의 문자열에서 해당 문자를 제거하는 가장 쉬운 방법입니다

string dateString = "2012-12-23 01:13:51.253"; 
string format = "yyyy-MM-dd hh:mm:ss.fff"; 

DateTime dateTime = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 

을 나는의 무엇 'ABC'일부 확실하지 않다 당신의 문자열입니다,하지만 한 달의 세 문자로 된 약어 있다면, 당신은이에 형식 문자열을 변경할 수 있습니다

string format = "MMM yyyy-MM-dd hh:mm:ss.fff"; 

여기 날짜 시간 구문 분석에 대한 사용자 지정 형식 코드의 전체 목록은 다음과 같습니다 01,

관련 문제