我希望按日期对字符串列表进行排序。我收到的字符串显示如下:
有没有办法获取日期,即使子字符串的长度是可变的,如果它只是一个数字而没有在初始数字上附加0?我已尝试使用Regex.Match()但似乎无法找到处理前几位数的最佳方法:
soup
我也尝试过以下多种形式的代码:
Match match = Regex.Match(toBeInsertedList.ToString(), @"\d{1}-\d{2}-\d{4}");
string date = match.Value;
var combineList = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.CurrentCulture);
任何指导都会很好,因为我还在学习。
谢谢!
答案 0 :(得分:0)
这是对正则表达式进行简单更改以提取初始数字或2位数字:
\d{1,2}-\d{2}-\d{4}
这只是说在第一个破折号之前抓住1到2位数。
答案 1 :(得分:0)
这里有两点
首先,您可以使用{1,2}
指定字符数,这意味着匹配1或2个字符。
\d{1,2}-\d{2}-\d{4}
其次,格式错误
var combineList = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.CurrentCulture);
应如下所示,其中“d”表示最小数字为1,而“dd”表示最小数字为2。
var combineList = DateTime.ParseExact(date, "d-MM-yyyy", CultureInfo.CurrentCulture);
以下是我用来测试的代码
var str = @"1-05-2017,Early May bank holiday,scotland
1-08-2016,Summer bankholiday, scotland
1-12-2014,St Andrew's Day,scotland
14-04-2017,Good Friday, england-and - wales";
var matches = Regex.Matches(str, @"\d{1,2}-\d{2}-\d{4}");
foreach (var match in matches)
{
string date = match.ToString();
var combineList = DateTime.ParseExact(date, "d-MM-yyyy", CultureInfo.CurrentCulture);
Debug.WriteLine(combineList.ToString());
}
结果
5/1/2017 12:00:00 AM
8/1/2016 12:00:00 AM
12/1/2014 12:00:00 AM
4/14/2017 12:00:00 AM
答案 2 :(得分:0)
另一个想法是使用string.Split(',')
将字符串拆分为逗号字符,并将结果数组中的第一项作为日期字符串,然后使用DateTime.ParseExact()
将字符串解析为有效日期:
static void Main()
{
var lines = new List<string>
{
"1-05-2017,Early May bank holiday, scotland",
"1-08-2016,Summer bankholiday, scotland",
"1-12-2014,St Andrew's Day,scotland",
"14-04-2017,Good Friday, england-and-wales"
};
var orderedLines = lines.OrderByDescending(x =>
DateTime.ParseExact(x.Split(',')[0], "d-MM-yyyy",
CultureInfo.InvariantCulture)).ToList();
foreach (var line in orderedLines)
{
Console.WriteLine(line);
}
Console.CursorVisible = false;
Console.Write("\nPress any key to exit...");
Console.ReadKey();
}
请注意,结果将以我当地的文化格式打印出来: