我有一个包含两个日期的字符串。我查看了.Split和.Substring函数。不确定我是走最有效的路线。是否有一种干净的方法从字符串中提取日期?
string test = "Hello World. Random date1 is 12/10/2010. Now 4 days later is 12/14/2010."
答案 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...
,那么这将无效。
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);
}
}