2012-04-12 147 views
2

我想要做的是重命名特定文件夾中的所有文件,例如,如果文件名中包含任何數字,它將被刪除。使用正則表達式重命名文件

說,如果一個文件名是 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:關於那個正則表達式,我發佈了一個問題Regular Expression for numbers?(顯然我還不夠清楚),從中得到了我的正則表達式,如果你認爲其他正則表達式會更好,請告訴我,如果你需要其他的信息請讓我知道...

回答

0

爲了取代你應該看看Regex.Replace它可以一次代替所有的出現。

否則碼看行(與它使用常量字符串奇怪fileName.Replace("match", "")例外...)

+0

Thankx!這是一個錯字。我現在糾正它! :D – Razort4x 2012-04-12 04:26:55

1

你可以嘗試Regex.Replace刪除位數,即:

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

我想他想刪除'foreach'並且優化重命名過程。 – AYK 2012-04-12 04:34:33

0

這個怎麼樣?基於Regex匹配要被處理

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方法現在將限制文件的數量。如果文件包含一個數字或-那麼它將被處理,從而優化整個過程。 RenameFile取代數字和-一個字符串並給你一個newFileName

我不太肯定的File.Move(file, Path.Combine(Path.GetDirectoryName(file), newFileName));正確性雖然,但我猜你的問題是要避免foreach循環,我想我已經提供了適當的解。

請注意,我無法完全測試這個,所以讓我知道它是否適用於您,如果不適合,我會很樂意進一步幫助您。

編輯:忘了提,file.Replace(@"(\d+)|(-+)", "")將從file字符串中移除數字以及-

編輯:更正file.ReplaceRegex.Replace

1

在您只是希望只需重命名文件關閉的機會,你認爲創建自己的計劃將是最好的方式 - 我會建議PFrank作爲一個獨立的工具(特別是如果你瞭解正則表達式的話)

如果你想要這個,如果你需要我的建議(和因爲它不是最簡單和最清晰的界面),你可以使用\d+(\s?-)?表示匹配表達式(在PFrank的第一列中),它應該匹配任意數量的數字,可選地在兩者之間連接一個連字符和一個附加的可選空白字符。然後您將沒有替換表達式(零長度字符串或PFrank中的空的第二列)。最後,選擇包含要重命名文件的文件夾,然後單擊scan按鈕;在彈出的對話框中,確認您的結果並點擊rename按鈕。對不起,如果我浪費了任何人的時間!

0

我更喜歡使用括號來選擇before和after,然後使用$ n方法來重建字符串的方式。

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