在C#中使用正则表达式匹配目录中的所有文件

时间:2016-03-16 01:38:44

标签: c# regex linq

我目前正在尝试在C#中使用以下正则表达式

Regex reg = new Regex(@"-(FILENM01P\\.(\\d){3}\\.PGP)$");
var files = Directory.GetFiles(savePath, "*.PGP")
    .Where(path => reg.IsMatch(path))
    .ToList();
foreach (string file in files)
{
    MessageBox.Show(file);
}

将具有此文件命名约定的所有文件匹配到单个目录

 FILENM01P.001.PGP

如果我只是加载像这样的所有文件

var files = Directory.GetFiles(savePath, "*.PGP")
foreach (string file in files)
{
    MessageBox.Show(file);
}

我得到一个像这样的字符串;等

  

C:\ Users \ User \ PGP Files \ FILENM01P.001.PGP

例如,可能有许多这样的文件

FILENM01P.001.PGP
FILENM01P.002.PGP
FILENM01P.003.PGP
FILENM01P.004.PGP

但永远不会有

FILENM01P.000.PGP
FILENM01P.1000.PGP

为了澄清,只有3个数字会一起变化,并且只能在001到999之间(带前导零),文本的其余部分是静态的,永远不会改变。

对于RegEx,我是一个完整的新手,所以任何帮助都将非常感激。

基本上我的最终目标是找到下一个数字并创建文件,如果没有文件,那么它将创建一个从001开始,如果它到达999然后它返回1000,这样我知道我需要移动到新目录,因为每个目录限制为999个顺序文件。 (我会处理这些东西)

3 个答案:

答案 0 :(得分:1)

Regex regex = new Regex(@"FILENM01P\.(\d+)\.", RegexOptions.IgnoreCase);
var fnumbers = Directory.GetFiles(src, "*.PGP", SearchOption.TopDirectoryOnly)
                .Select(f=>regex.Match(f))
                .Where(m=>m.Success)
                .Select(m=>int.Parse(m.Groups[1].Value));
int fileNum = 1 + (fnumbers.Any() ? fnumbers.Max() : 0);

答案 1 :(得分:1)

试试这段代码。

var reg = new Regex(@"FILENM01P\.(\d{3})\.PGP");

var matches = files.Select(f => reg.Match(f)).Where(f => f.Success).Select(x=> Convert.ToInt32(x.Value.Split('.')[1])).ToList();

var nextNumber = (matches.Max() + 1).ToString("D3"); // 3 digit with leading zeros

此外,您可能需要if检查以查看下一个数字是否为1000,如果是,则返回0.

(matches.Max() + 1 > 999? 0:matches.Max() + 1).ToString("D3")

我的测试用例。

List<string> files = new List<string>();
files.Add(@"C:\Users\User\PGP Files\FILENM01P.001.PGP");
files.Add(@"C:\Users\User\PGP Files\FILENM01P.002.PGP");
files.Add(@"C:\Users\User\PGP Files\FILENM01P.003.PGP");
files.Add(@"C:\Users\User\PGP Files\FILENM01P.004.PGP");

输出

nextNumber = "005";

答案 2 :(得分:0)

您可以这样做:

var reg = new Regex(@"FILENM01P\.(\d{3})\.PGP");

var matches = files.Select(f => reg.Match(f)).Where(f => f.Success).ToList();

var nextNumber = matches.Any()
    ? matches.Max(f => int.Parse(f.Groups[1].Value)) + 1 
    : 1;

其中files是要匹配的文件列表。