正则表达式匹配以大于特定数字的数字开头的字符串

时间:2015-08-25 12:04:22

标签: c# regex asp.net-mvc

我有一个文件名列表,我必须根据它们的名称选择某些文件。文件名如下

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的帮助下如何做到这一点。但我对这个概念很新。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

我认为这些不是数字而是日期。所以你想在2015-08-20之后的每一个日期。

您可以在此LINQ查询中使用String.SplitDateTime.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日期。对于任何其他日期,您必须创建不同的正则表达式。此情况也不会验证该数字是否为实际日期。只有几个原因,为什么解析解决方案会更好。