2010-05-10 110 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