![](/img/trans.png)
[英]C# List files in current directory with matching regex pattern in an array
[英]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.