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

标签 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 个连续文件。 (不过我会处理这些东西)

最佳答案

试试这段代码。

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

关于c# - 在 C# 中使用正则表达式匹配目录中的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36025349/

相关文章:

c# - 如何检查一个单词是否以给定字符开头?

javascript - 如何停止在没有换行符的字符串中进行正则表达式捕获但仍全局捕获?

c# - 如何使用 LINQ to XML 检索嵌套数组?

c# - Entity Framework 核心 : Log queries for a single db context instance

c# - 使用 ClickOnce 使桌面图标模糊

c# - ReadAsMultipartAsync 和 MultiPartFormDataStreamProvider 出错

使用 RegEx 列出的 Python 字符串

javascript - 如果它是空字符串,则正则表达式不匹配

c# - LINQ 表达式 C# 中的条件

c# - 将循环转换为 LINQ