匹配以大于特定数字开头的字符串的正则表达式
本文关键字:开头 字符串 正则表达式 数字 大于 | 更新日期: 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.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
。如果您不熟悉扩展方法,请查看此处
如果你真的需要一个正则表达式,它就在这里。
$([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日期。对于任何其他日期,您必须创建不同的正则表达式。此外,这并不能验证该数字是否为实际日期。以下是解析解决方案更好的几个原因: