我想解析字符串中的日期,其中日期格式可以是任何不同的格式。
现在为了匹配日期,我们可以使用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匹配。但这不能解析字符串中的日期,因为它与某些字符串中的日期不匹配。
像
如果日期为"May 26 2008"
,那么我们可以定义格式"MMM dd yyyy"
,并且日期将匹配。
但是如果日期在某些字符串中就像"Abc May 26 2008"
那样,则日期将不会匹配。那么我们可以在这里使用正则表达式吗?如果是的话怎么样?
我要解析日期的字符串,从html页面解析,字符串可以是任何不同的。
编辑:我想写的格式匹配任何使用正则表达式的日期字符串。
答案 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
答案 1 :(得分:1)
如果它只是英文版,格式为“MMM dd yyyy”,你可以搜索你的字符串[1月| 2月| ... | 12月]日的位置。
但你首先应该问问自己为什么要解析任何字符串。你能否强迫用户使用预定义的格式并验证输入?
答案 2 :(得分: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);
}
更新: 您可能应该使用正则表达式来查找与文本中的日期匹配的字符串。您必须确定您期望的日期格式并编写(或选择)适当的正则表达式。例如,对于“dd MMM yyyy”格式,您可以使用以下正则表达式:
^ \ d {2} \ S {1}(一月| 2月| 3月|四月|五月|六月|七月|四月|九月|十月| 11月|十二月)\ S {1} \ d {4} $
来自http://regexlib.com/REDetails.aspx?regexp_id=325
的Stephen Lam或者,您可以浏览this site以找到合适的表达方式。
答案 3 :(得分:0)
如果您知道您的日期将从一个月开始,那么您可以使用子字符串来获取该部分。 (查找Jan / Feb / etc的出现)
答案 4 :(得分:0)
我觉得像\w{3,8} \d\d \d\d\d\d[\s$]
这样的东西大部分时间都会起作用,如果它是美国格式的,但是如果您正在解析的文本可能只是任何东西,我不会太相信它。
答案 5 :(得分:0)
这是从字符串解析日期的链接,非常好。有一组正则表达式来解析字符串中的日期。
http://www.codeproject.com/KB/datetime/date_time_parser_cs.aspx