2010-05-10 111 views
1

我想從字符串中解析日期,其中日期格式可以是任何不同的格式。如何從字符串解析日期?

現在爲了匹配日期,我們可以使用DateTime.TryParseExact,我們可以根據需要定義格式,並且日期可以匹配任何不同的格式。

string[] formats = {"MMM dd yyyy"}; 

      DateTime dateValue; 
      string dateString = "May 26 2008"; 

      if (DateTime.TryParseExact(dateString, formats, 
              new CultureInfo("en-US"), 
              DateTimeStyles.None, 
              out dateValue)) 

        MessageBox.Show(dateValue.ToString()); 

這本不是爲解析來自那就是它不與這在某些字符串中的日期相匹配的字符串的日期工作date.But匹配。

像 如果日期是"May 26 2008"那麼我們可以定義格式"MMM dd yyyy"和日期將匹配。

但是,如果日期是在像"Abc May 26 2008"一些字符串,那麼日期將不匹配。因此,我們可以在這裏使用正則表達式?如果是的話如何?

我想解析日期的字符串,從html頁面解析出來,字符串可以是任何不同的。

編輯:我想寫的格式就像匹配任何字符串,其中有一個使用正則表達式的日期。

+0

是日期的字符串中的位置固定的(就像是在年底或在一定的字符數)? – Bobby 2010-05-10 08:00:47

+0

不是,日期可以在字符串中的任何地方,實際上我是從html頁面解析字符串,然後檢查字符串中是否有日期,如果是,則從字符串中解析日期。 – Harikrishna 2010-05-10 08:02:24

回答

1

如果它只是英文,格式爲「MMM dd yyyy」,則可以搜索字符串[1月| 2月| ... | 12月]每年的位置。

但是你應該首先問自己爲什麼要解析任何字符串。你不能強迫用戶使用預定義的格式並驗證該輸入嗎?

+0

它不是那樣的。我解析html頁面以在datagridview中顯示一些有用的信息。爲此,我將檢查html頁面中的每個表格,並且在每個表格中檢查每一行,並且爲每一個檢查每一個columninnertext在列中是否存在日期,而列中的字符可以是任何字符串。 – Harikrishna 2010-05-10 08:22:00

0

如果您知道您的日期將從一個月開始,那麼您可以使用子字符串來獲取該部分。 (查找一月/二月等的發生)

3

你可以在@"[A-Za-z]{3} \d{2} \d{4}"之類的東西上進行正則表達式匹配,並將任何匹配送入DateTime.TryParseExact。然而,它可能會打破其他文化,但我不知道是否有語言周圍的月份名稱只有2個字母或東西:)

或者,您可以從cultureInfo.DateTimeFormat.AbbreviatedMonthNames提取月份名稱並使用它來構建有針對性的正則表達式略好它也應該適用於其他文化。

編輯 - 這裏有一個例子:

string text = "Apr 03 2010 foo May 27 2008 bar"; 
CultureInfo ci = new CultureInfo("en-US"); 
Regex regex = new Regex(@"(?<date>(" + String.Join("|", 
    ci.DateTimeFormat.AbbreviatedMonthNames, 0, 12) + @") \d{2} \d{4})"); 

// Builds this regex: 
// (?<date>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{4}) 

var matches = regex.Matches(text); 
foreach (Match match in matches) 
{ 
    string capturedText = match.Groups["date"].Value; 
    DateTime dt; 
    if (DateTime.TryParseExact(capturedText, "MMM dd yyyy", ci, 
     DateTimeStyles.None, out dt)) 
    { 
     Console.WriteLine(capturedText + ": " + dt.ToLongDateString()); 
    } 
} 

// Prints two parsed dates in long format 
+0

@ Thorarin,我不明白。 – Harikrishna 2010-05-10 09:17:47

+0

@Harikrishna:這是一個工作示例。稍微修改代碼,因爲顯然月份數組包含13個元素。示例僅適用於公曆。 – Thorarin 2010-05-10 10:09:05

+0

@ Thorarin,它不適用於'Apr032010'。 – Harikrishna 2010-05-10 10:41:22

0

我認爲像\w{3,8} \d\d \d\d\d\d[\s$]將工作的大部分時間,如果它在美國的格式,但如果文本你分析我不相信太多可以是任何東西。

1

您可以根據自己的需要自定義格式:

private const string DateTimeFormat = "dd-MMM-yy hh.mm.ss.ffffff tt"; 

public static bool TryParseToDateTime(this string stringValue, out DateTime result) 
{ 
    if (String.IsNullOrEmpty(stringValue)) 
    { 
     result = DateTime.MinValue; 
     return false; 
    } 

    return DateTime.TryParseExact(stringValue, DateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out result); 
} 

UPDATE: 你或許應該使用正則表達式來查找匹配文本日期的字符串。你必須決定你期望的日期格式,並寫出(或選擇)適當的正則表達式。例如,對於「dd MMM yyyy」格式,您可以使用以下正則表達式:

^\ d {2} \ s {1}(Jan | Feb | Mar | Apr | May | Jun | Jul | Apr |九月|十月|十一月|十二月)\ S {1} \ d {4}從http://regexlib.com/REDetails.aspx?regexp_id=325

$

由林瑞麟另外,您可以瀏覽this site找到合適的表達。

+0

@ Boris,字符串不固定,它可以是任何類型的字符串。 – Harikrishna 2010-05-10 08:23:08

+0

Harikrishna,你想如何解析「1/3/10」?它可能是2010年3月1日或2010年1月3日或其他任何東西?您必須定義所需的格式並使用正則表達式來查找文本 – 2010-05-10 10:25:06

+0

@ Boris中的匹配,只有一種格式爲01/03/2010。但如果日期在任何字符串中,則應匹配。 – Harikrishna 2010-05-10 10:35:27