使用正则表达式重命名文件
本文关键字:文件 重命名 正则表达式 | 更新日期: 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'