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

本文关键字:开头 字符串 正则表达式 数字 大于 | 更新日期: 2023-09-27 18:09:39

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

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

我知道,我们可以在正则表达式的帮助下做一些事情。但我对这个概念很陌生。那么我该怎么做呢?

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

我想这些不是数字而是日期。所以你想取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。如果您不熟悉扩展方法,请查看此处

如果你真的需要一个正则表达式,它就在这里。

$([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种不同的情况,通过使用$锚定到开始,|锚定到"或"单独的正则表达式在一起。以下是每种情况的描述。

第一个数字大于0的超过8位数字(假设这些是日期,并且您不关心9999年之后的任何内容,则可能不需要这个数字)

([1-9]'d{8,})

8位数字且第一个数字大于3(如果您不关心年份2999之后的任何内容,则不需要)

([3-9]'d{7})

8位数字,第一个数字是2,第二个数字大于0(如果你不关心年份2099之后的任何内容,则不需要)

(2[1-9]'d{6})

8位数字,前两位是20,第三位大于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日期。对于任何其他日期,您必须创建不同的正则表达式。此外,这并不能验证该数字是否为实际日期。以下是解析解决方案更好的几个原因: