我有一个文件名列表,我必须根据它们的名称选择某些文件。文件名如下
20150827_5406006_Calls
20150826_5406006_Calls
20150825_5406006_Calls
20150824_5406006_Calls
20150823_5406006_Calls
20150822_5406006_Calls
20150821_5406006_Calls
20150820_5406006_Calls
20150819_5406006_Calls
20150818_5406006_Calls
现在我想选择名称以大于20150820
所以我的预期结果将是
20150827_5406006_Calls
20150826_5406006_Calls
20150825_5406006_Calls
20150824_5406006_Calls
20150823_5406006_Calls
20150822_5406006_Calls
20150821_5406006_Calls
我知道,我们可以在regex的帮助下如何做到这一点。但我对这个概念很新。我怎么能这样做?
答案 0 :(得分:1)
我认为这些不是数字而是日期。所以你想在2015-08-20
之后的每一个日期。
您可以在此LINQ查询中使用String.Split
和DateTime.TryParseExact
:
string[] allowedFormats = { "yyyyMMdd" };
DateTime minDate = new DateTime(2015, 8, 20);
List<string> resultFilenames = fileNames
.Select(fn => new { FileName = fn, DateString = fn.Split('_')[0].Trim() })
.Select(x => new
{
x.FileName,
DateOrNull = x.DateString.TryGetDateTime(null, allowedFormats)
})
.Where(x => x.DateOrNull.HasValue && x.DateOrNull.Value.Date > minDate)
.Select(x => x.FileName)
.ToList();
使用此扩展名将字符串标记解析为DateTime?
:
public static DateTime? TryGetDateTime(this string item, DateTimeFormatInfo dfi, params string[] allowedFormats)
{
if (dfi == null) dfi = DateTimeFormatInfo.InvariantInfo;
DateTime dt;
bool success = DateTime.TryParseExact(item, allowedFormats, dfi, DateTimeStyles.None, out dt);
if (success) return dt;
return null;
}
您需要在代码文件的顶部添加using System.Linq;
,并且由于using System.Globalization;
,扩展类必须已添加DateTimeFormatInfo
。如果您不熟悉扩展方法,请使用loook here。
答案 1 :(得分:1)
如果你真的需要一个正则表达式,那么它就是。
$([1-9]\d{8,})|([3-9]\d{7})|(2[1-9]\d{6})|(20[2-9]\d{5})|(201[6-9]\d{4})|(2015[1-9]\d{3})|(201509\d\d)|(201508[3-9]\d)|(2015082[1-9])
这基本上在字符串的开头查找9个不同的案例,方法是使用$
锚定到开头,|
到&#34;或者#34;单独的正则表达式在一起。以下是每种情况的描述。
超过8位数,其中第一位数字大于0(假设这些是日期而您可能不需要这个数字,并且您不关心过去9999年的任何事情)
([1-9]\d{8,})
8位数字和第一位数字大于3位(如果您不关心2999年以后的任何事情,则不需要)
([3-9]\d{7})
8位数字,第一位数字是2,第二位数字大于0(如果您不关心2099年以后的任何事情,则不需要)
(2[1-9]\d{6})
8位数字,前2位数字为20位,第3位数字大于1位数(如果您不关心2019年以后的任何事情,则不需要)
(20[2-9]\d{5})
8位数字和前3位数字是201,第4位数字大于5(如果您不关心2015年以后的任何事情,则不需要)
(201[6-9]\d{4})
8位数字,前4位数字是2015年,第5位数字大于0
(2015[1-9]\d{3})
8位数字,前5位数字是20150年,第6位数字大于8
(201509\d\d)
8位数字,前6位数字是201508,第7位数字大于2
(201508[3-9]\d)
8位数字,前7位数字是2015082,第8位数字大于0
(2015082[1-9])
应该注意的是,此正则表达式特别适用于您至少使用的20150820日期。对于任何其他日期,您必须创建不同的正则表达式。此情况也不会验证该数字是否为实际日期。只有几个原因,为什么解析解决方案会更好。