使用正则表达式重命名文件

本文关键字:文件 重命名 正则表达式 | 更新日期: 2023-09-27 18:31:01

我想做的是重命名特定文件夹中的所有文件,这样如果文件名中包含任何数字,则会将其删除。

比如说,如果文件名是 someFileName.someExtension它保持不变,但如果文件是这样的, 03 - Rocketman Elton John它应该重命名为 Rocketman Elton John(我做了删除-的部分),另一个例子,如果文件名15-Trey Songz - Unfortunate (Prod. by Noah 40 Shebib)它应该重命名为 Trey Songz Unfortunate (Prod. by Noah Shebib)(再次我可以删除-)。要求用户选择如下所示的文件夹

private void txtFolder_MouseDown(object sender, MouseEventArgs e)
        {
            FolderBrowserDialog fd = new FolderBrowserDialog();
            fd.RootFolder = Environment.SpecialFolder.Desktop;
            fd.ShowNewFolderButton = true;
            if (fd.ShowDialog() == DialogResult.OK)
            {
                txtFolder.Text = fd.SelectedPath;
            }
        }

此外,它重命名是这样开始的

private void btnGo_Click(object sender, EventArgs e)
{
    StartRenaming(txtFolder.Text);
}

private void StartRenaming(string FolderName)
{
   string[] files = Directory.GetFiles(FolderName);
   foreach (string file in files)
        RenameFile(file);
}

现在在重命名文件中,我需要函数,即将删除文件中的任何数字的正则表达式。它的实现为

private void RenameFile(string FileName)
{
    string fileName = Path.GetFileNameWithoutExtension(FileName);
   /* here the function goes that will find numbers in filename using regular experssion and replace them */ 
}

所以我能做的是,我可以使用类似的东西

1  var matches = Regex.Matches(fileName, @"'d+");
2  
3  if (matches.Count == 0)
4    return null;
5
6  // start the loop
7  foreach(var match in matches)
8  {
9     fileName = fileName.Replace(match, ""); /* or fileName.Replace(match.ToString(), ""), whatever be the case */    
10 }
11  File.Move(FileName, Path.Combine(Path.GetDirectoryName(FileName), fileName));
12  return;

但我不认为这是正确的方法吗?有没有更好的选择?或者这是这样做的最佳(也是唯一的选择)?另外,String.Replace中是否有类似IN的东西?比如说在 sql 中我可以在 select 命令中使用 IN 并指定一堆 where 条件,但是 String.Replace 有这样的东西,这样我就不必运行我从第 7 行跑到 10 行的循环吗?还有其他更好的选择吗?

ps:关于那个正则表达式,我发布了一个问题 数字的正则表达式?(显然我不够清楚)从中我得到了我的正则表达式,如果您认为其他正则表达式会做得更好,请告诉我,如果您需要任何其他信息,请告诉我......

使用正则表达式重命名文件

你可以试试 Regex.Replace 去掉数字,即:

Regex.Replace(fileName, @"'d", "");

如果您只是想简单地重命名文件,并且您认为创建自己的程序将是最好的方法 - 我建议将 PFrank 作为一个独立工具(特别是如果您已经了解正则表达式)

如果您确实希望这样做并且您确实接受了我的建议(并且因为它不是最简单和最清晰的界面),您将使用 'd+('s?-)? 作为匹配表达式(在 PFrank 的第一列中),它应该匹配任意数量的数字,可以选择在两者之间后跟一个连字符和一个额外的可选空格字符。这样,您将没有替换表达式(零长度字符串或 PFrank 中的空第二列)。最后,选择包含要重命名的文件的文件夹,然后单击scan按钮;在弹出的对话框中,确认结果并单击 rename 按钮。对不起,如果我浪费了任何人的时间!

要替换,您应该查看 Regex.Replace 它可以一次替换所有出现的情况。

否则代码看起来不错(除了使用常量字符串的奇怪fileName.Replace("match", "")...

这个怎么样?

private void StartRenaming(string FolderName)
{
    string[] files = Directory.GetFiles(FolderName);
    string[] applicableFiles = (from string s in files
                                where Regex.IsMatch(s, @"('d+)|(-+)", RegexOptions.None)
                                select s).ToArray<string>();
    foreach (string file in applicableFiles)
        RenameFile(file);
}
private void RenameFile(string file)
{
    string newFileName = Regex.Replace(file, @"('d+)|(-+)", "");
    File.Move(file, Path.Combine(Path.GetDirectoryName(file), newFileName));
}

StartRenaming方法现在将根据匹配Regex限制要处理的文件数。如果文件包含数字或-则将对其进行处理,从而优化整个过程。 RenameFile替换字符串中的数字和-,并为您提供newFileName

我不太确定File.Move(file, Path.Combine(Path.GetDirectoryName(file), newFileName));的正确性,但我想你的问题是避免foreach循环,我认为我已经提供了一个适当的解决方案。

请注意,我无法完全测试这一点,所以让我知道它是否适合您,如果不适合,我将很乐意为您提供进一步的帮助。

编辑:忘了提到file.Replace(@"('d+)|(-+)", "")将从file字符串中删除数字和-

编辑:更正file.Replace Regex.Replace

我更喜欢使用括号来选择之前和之后,然后使用 $n 方法以您想要的方式重建字符串。

"03 - Rocketman Elton John"  -Replace '^([^-]*) - ([^-]*)', '$1 $2'