使用正则表达式重命名文件
我想要做的是重命名特定文件夹中的所有文件,这样如果文件名中包含任何数字,它将被删除。
比方说,如果一个文件名是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 ,它可以立即替换所有出现的内容。
否则代码看起来不错(除了奇怪的fileName.Replace("match", "")
,它使用常量字符串…)
您可以尝试使用Regex.Replace删除数字,即:
Regex.Replace(fileName, @"\d", "");
如果您只想简单地重命名文件并且认为创建自己的程序是最好的方法,那么我会推荐PFrank作为一个独立的工具(特别是如果您已经了解正则表达式)
如果你确实需要这个,如果你确实采取了我的建议( 并且因为它不是最简单和最清晰的界面 ),你会使用\d+(\s?-)?
对于匹配表达式(在PFrank的第一列中),它应匹配任意数量的数字,可选地后跟连字符和两者之间的附加可选空格字符。 然后,您将没有替换表达式(PFrank中的零长度字符串或空的第二列)。 最后,选择包含要重命名的文件的文件夹,然后单击scan
按钮; 在弹出的对话框中,确认结果并单击rename
按钮。 对不起,如果我浪费了任何人的时间!
这个怎么样 ?
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(); 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));
的正确性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'