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

时间:2012-04-12 04:06:41

标签: c# regex file-rename

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

说,如果文件名是 someFileName.someExtension它保持不变,但如果文件是这样的, 03 - Rocketman Elton John它应该重命名为Rocketman Elton John(我做了删除-的部分),另一个示例,如果文件名是15-Trey Songz - Unfortunate (Prod. by Noah 40 Shebib),则应将其重命名为{{1} (我可以删除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 */ 
}

但我不认为这是正确的方法吗?有没有更好的选择呢?或者这是最好的(也是唯一的选择)吗?另外,String.Replace中有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; 之类的东西吗?在sql中说我可以在select命令中使用IN并指定一堆where条件,但是使用String.Replace是这样的,所以我不必运行从第7行运行的循环到10?还有其他更好的选择吗?

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

5 个答案:

答案 0 :(得分:1)

您可以尝试使用Regex.Replace删除数字,即:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

对于替换你应该查看Regex.Replace,它可以一次替换所有出现。否则代码看起来没问题(除了使用常量字符串的奇怪fileName.Replace("match", "") ...)

答案 3 :(得分:0)

这个怎么样?

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

答案 4 :(得分:0)

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

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