2013-03-21 2 views
5

나는이 같은 텍스트의 큰 덩어리를 가지고 :는 날짜 시간에 문자열 이런 종류의 구문 분석 - "금요일 22 월 2013 년"(C#을)

.... 금요일 22 년 3 월 2013 잠재력을 가지고 조언 ..... 하루에 선언 될 것입니다.

나는 DateTime을 찾아서 (2013 년 3 월 22 일 금요일) 구문 분석해야합니다. 나는 그것을 찾을 수 있고 DateTime.TryParse를 사용하여 거의 모든 것을 얻을 수 있지만 서수 접미사 (st, nd, rd, th)는 나를 버리게합니다.

TryParse 메서드를 호출하기 전에 형식 문자열을 만들 때 이러한 접미사를 고려하기 위해 사용할 수있는 와일드 카드 문자가 있습니까? 아니면 다른 제안?

감사합니다.

+1

당신이 그들에게 접미사를 제거하는 시도 되세요 string.replace 또는 regex를 사용합니까? 그게 선택의 여지가 있니? –

답변

2

regex을 사용하여 원하지 않는 문자를 대체하는 방법은 어떻습니까?

예를 들어 다음 정규식은 작업을 수행해야합니다 : "(?<=\d)[a-z]{2}".

예제 코드

string date = "Friday 22nd March 2013"; 
var r = new Regex(@"(?<=\d)[a-z]{2}"); 
String result = r.Replace(date, ""); 
Console.WriteLine(DateTime.Parse(result, CultureInfo.InvariantCulture)); 

출력 :

22/03/2013 00:00:00 

이 대부분의 경우 알아서하지만, 제대로 테스트 할 수 있는지 확인해야합니다.

+1

그리고 일요일에 "nd"가 ""로 바뀌고 kaboom으로 바뀝니다! –

+0

@NikolaDavidovic 전체 답변을 읽었습니까? 마지막 부분을 다시 읽으십시오. :) – eandersson

+0

당신이 제안한 대답은 틀렸지 만 나중에 일반화가 좋습니다. 왜 당신은 정규식을 제안하지 않습니까? –

1

언제든지 Brute Force를 사용할 수 있습니다.

참고 : 동일한 모양과 느낌을 갖기 위해 Fuji의 코드 중 일부를 빌려 올 것입니다.

string date = "Friday 22nd March 2013"; 
string[] split = date.Split(' '); 
string dayOfWeek = split[0]; // throw away & don't need 
int day = Convert.ToInt32(split[1].SubString(0, split[1].Length - 2); 
int month = 0; 
switch (split[2]) { 
    case "January": month = 1; break; 
    case "February": month = 2; break; 
    case "March": month = 3; break; 
    case "April": month = 4; break; 
    case "May": month = 5; break; 
    case "June": month = 6; break; 
    case "July": month = 7; break; 
    case "August": month = 8; break; 
    case "September": month = 9; break; 
    case "October": month = 10; break; 
    case "November": month = 11; break; 
    case "December": month = 12; break; 
} 
int year = Convert.ToInt32(split[3]); 
var dateTime = new DateTime(year, month, day); 
Console.WriteLine(dateTime); 

아니요 "new DateTime"생성자가 정확합니다. 지금 IDE를 실행하고 있지 않습니다.

0

an overload of DateTime.Parse that allows multiple format strings있다 - 당신이 (즉, 월/일 이름의 철자를 해결하기 위해 스레드 로케일을 사용)이 도우미 메서드 같은 리터럴 문자열로 서수에 전달할 수 있습니다 :

private static DateTime ParseOrdinalDateTime(string dt) 
{ 
    string[] expectedFormats = new[] { 
             "dddd d'st' MMMM yyyy", 
             "dddd d'nd' MMMM yyyy", 
             "dddd d'rd' MMMM yyyy", 
             "dddd d'th' MMMM yyyy" 
             }; 

    return DateTime.ParseExact(dt, expectedFormats, null, DateTimeStyles.None); 
}