我有一个应用程序需要查找并处理遵循非常具体的命名约定的文件,如下所示。
IABC_12345-0_YYYYMMDD_YYYYMMDD_HHMMSS.zip
我无法使用搜索模式看到任何简单的方法,所以我假设在使用更简单的通配符模式生成文件列表后,我必须执行类似的操作。
RegEx re = new RegEx("blah");
foreach(FileInfo fi in Directory.GetFiles(path, "I*.zip"))
{
if(re.IsMatch(fi.Name))
//blah blah blah
}
这是执行此操作的最佳方式吗?如果是这样,我将如何形成正则表达式以匹配此文件格式?
答案 0 :(得分:17)
string pattern = @"I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip";
var matches = Directory.GetFiles(@"c:\temp")
.Where(path => Regex.Match(path, pattern).Success);
foreach (string file in matches)
Console.WriteLine(file); // do something
答案 1 :(得分:7)
这取决于您希望匹配这些名称的具体方式。这是否足够具体:
I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip
说明:
I // match an 'I'
[A-Z]{3} // followed by three upper case letters
_ // followed by an underscore
\d{5} // followed by five digits
- // followed by a hyphen
\d // followed by a single digit
_ // followed by an underscore
\d{8} // followed by eight digits
_ // followed by an underscore
\d{8} // followed by eight digits
_ // followed by an underscore
\d{6} // followed by six digits
\.zip // followed by '.zip'
但是,如果您的文件名称包含无效的日期或时间,则实际上不能单独使用regex,尤其是DATE_DATE
部分指定日期范围时。您将必须匹配I(和其他)向您显示的所有文件名,然后执行一些“常规”编程逻辑来过滤掉无效的文件名。
答案 2 :(得分:2)
对于一个简单的正则表达式,它也会匹配无效的时间规范(即小时= 73等),你可以使用这样的东西:
^I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip$
答案 3 :(得分:0)
RegexBuddy是一个花几块钱的好方法(如果你有一些花钱)。它将帮助您开发,测试和调试您的正则表达式。它甚至可以为您创建代码片段。
RegexMagic(来自同一作者)甚至可以为您提供更多帮助:它可以帮助您从样本创建正则表达式模式。 (我没试过,所以我不能说它是否好)。