使用正则表达式重命名文件(Rename file using regular expression)

2019-09-16 12:20发布

我想要做的是重命名所有文件在一个特定的文件夹,例如,如果文件名包含在其中的任何数字,它被删除。

比方说,如果一个文件名是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;

但我不认为这是应该做的正确方法? 有没有更好的选择,这样做呢? 或者这是最好的(也是唯一的选项)来做到这一点? 此外,有没有像什么IN在与string.replace? 说,在SQL我可以使用IN的选择命令,并指定了一堆那里的条件,但有这样的事情有这样与string.replace,我没有跑,我从7号线跑了10环? 是否还有其他更好的选择?

PS:关于正则表达式,我张贴的问题, 对数字的正则表达式? (显然我是不够清晰),并从我得到了我的正则表达式,如果你认为一些其它的正则表达式会做的更好,请告诉我,如果你还需要其他信息,请让我知道...

Answer 1:

对于更换你应该看看Regex.Replace可在更换一次所有出现。

否则码看行(奇怪的例外fileName.Replace("match", "")它使用常量字符串...)



Answer 2:

您可以尝试Regex.Replace删除位数,即:

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


Answer 3:

在关闭的机会,你只是希望简单地重命名文件和你认为创建自己的计划将是最好的方式-我会建议PFrank作为一个独立的工具(特别是如果你了解正则表达式的话)

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



Answer 4:

这个怎么样 ?

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.ReplaceRegex.Replace



Answer 5:

我更喜欢使用括号之前和之后进行选择,然后使用$ N方法来重建你怎么想它是字符串。

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


文章来源: Rename file using regular expression