如何从字符串变量中提取2个日期?

时间:2010-12-06 21:09:42

标签: c# regex

我有一个包含两个日期的字符串。我查看了.Split和.Substring函数。不确定我是走最有效的路线。是否有一种干净的方法从字符串中提取日期?

string test = "Hello World.  Random date1 is 12/10/2010. Now 4 days later is 12/14/2010." 

5 个答案:

答案 0 :(得分:5)

如果日期格式不会改变,您可以这样做:

private static readonly Regex dateRegex = new Regex(@"\d{1,2}/\d{1,2}/\d{4}");

public static IEnumerable<string> ExtractDates(string str)
{
    return dateRegex.Matches(str).Cast<Match>().Select(match => match.Value);
}

然后使用它:

foreach (var dateString in ExtractDates("...")) {
    // ...
}

对您的示例字符串进行了测试和处理。

答案 1 :(得分:0)

如果它实际上是您感兴趣的替代品,并且字符串格式不会改变,您可以:

string[] dates = test.Replace("Hello World. Random date1 is ", "").Replace("Now 4 days later is ", " ").Split(" ");

或者只是拆分不会改变的文本。

答案 2 :(得分:0)

正则表达式是最常用的方式,但根据日期的内容,可能很难做到正确。它可能会非常干净但也可能非常难看。从好的方面来说,你可以保证它总是只有几行代码而且很容易改变。

如果您的日期始终位于字符串中的特定索引处,那么您可以使用substring,但如果(例如)您可以使用Now 10 days later...,那么这将无效。

如果您知道每个日期始终是字符串中的第n个单词,则

Split将起作用。

编辑:刚刚看到你对文本和格式的评论总是一样的。我使用split或像Hello world. Random date1 is (\d\d/\d\d/\d\d\d\d). Now \d+ days later is (\d\d/\d\d/\d\d\d\d)这样的正则表达式。 (我知道,你可以让它更简洁。但它会起作用。我想。)

EDIT2:经过一番思考后更简洁的正则表达式:.*?(\d{2}/\d{2}/\d{4}).*?(\d{2}/\d{2}/\d{4})。这将允许您更改周围的文本,而无需更新正则表达式。

答案 3 :(得分:0)

这是一个棘手的问题。你可以这样做:

List<DateTime> dates = new List<DateTime>();

string test = "Hello World.  Random date1 is 12/10/2010. Now 4 days later is 12/14/2010."
var potentialDates = test.Split(" .",StringSplitOptions.RemoveEmptyEntries);
foreach (string s in potentialDates)
{
  DateTime d;
  if (DateTime.TryParseExact(s, "MM/dd/yyyy", out d))
  {
    dates.Add(d);
  }
}

这可能是linq-ified,但它应该可以正常工作。只要日期符合指示,这应该可以找到。如果您还有时间或者日期格式包含'.',那么您可能希望将“拆分”修改为仅拆分空间。你可以修剪前导和尾随标点符号并且没问题。也许是这样的:

List<DateTime> dates = new List<DateTime>();

string test = "Hello World.  Random date1 is 12/10/2010. Now 4 days later is 12/14/2010."
var potentialDates = test.Split(" ",StringSplitOptions.RemoveEmptyEntries);
foreach (string s in potentialDates)
{
  DateTime d;
  if (DateTime.TryParseExact(s.Trim(',', '.', ';', ':'), "MM/dd/yyyy", out d))
  {
    dates.Add(d);
  }
}

答案 4 :(得分:0)

使用正则表达式

public void SampleRegexUsage()
{
    string regex = @"\d{2}/\d{2}/\d{4}";
    RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline;
    string input = @"Hello World.  Random date1 is 12/10/2010. Now 4 days later is 12/14/2010.";

    MatchCollection matches = Regex.Matches(input, regex, options);
    foreach (Match match in matches)
    {
        Console.WriteLine(match.Value);

        Console.WriteLine(":" + match.Groups[""].Value);

    }
}