繁体   English   中英

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

[英]In C# matching all files in a directory using regex

我目前正在尝试在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文件\\ 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个连续文件。 (不过我会处理这些东西)

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);

试试这个代码。

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

另外,如果需要检查下一个数字是否为1000,则可能需要进行if检查,然后返回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";

您可以执行以下操作:

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是要匹配的文件列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM