2010-07-09 230 views
2

我有一個應用程序,用空格替換「無效」字符(由我的正則表達式定義)。我想要它,以便如果文件名中有兩個或更多個空格,請修剪一個。例如:正則表達式 - 擺脫雙空白?

Deal A & B.txt我的應用程序運行後,將被重命名爲Deal A   B.txt(3個空間B/W A和B)。我想要的是這樣的:Deal A B.txt(A和B之間的一個空格)。

我想確定如何做到這一點 - 我想我的應用程序將不得不通過所有文件名運行至少一次以替換無效字符,然後再次運行文件名以擺脫無關的空格。

有人可以幫我嗎?
這是目前用於替換無效字符我的代碼:

public partial class CleanNames : Form 
{ 
    public CleanNames() 
    { 
     InitializeComponent(); 

    } 

    public void Sanitizer(List<string> paths) 
    { 
     string regPattern = (@"[~#&$!%+{}]+"); 
     string replacement = " "; 

     Regex regExPattern = new Regex(regPattern); 


     StreamWriter errors = new StreamWriter(@"S:\Testing\Errors.txt", true); 
     var filesCount = new Dictionary<string, int>(); 


     dataGridView1.Rows.Clear(); 

      try 
      { 

       foreach (string files2 in paths) 
       { 

       string filenameOnly = System.IO.Path.GetFileName(files2); 
       string pathOnly = System.IO.Path.GetDirectoryName(files2); 
       string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); 
       string sanitized = System.IO.Path.Combine(pathOnly, sanitizedFileName); 


       if (!System.IO.File.Exists(sanitized)) 
       { 
        DataGridViewRow clean = new DataGridViewRow(); 
        clean.CreateCells(dataGridView1); 
        clean.Cells[0].Value = pathOnly; 
        clean.Cells[1].Value = filenameOnly; 
        clean.Cells[2].Value = sanitizedFileName; 
        dataGridView1.Rows.Add(clean); 

        System.IO.File.Move(files2, sanitized); 
       } 

       else 
       { 
        if (filesCount.ContainsKey(sanitized)) 
        { 
         filesCount[sanitized]++; 
        } 
        else 
        { 
         filesCount.Add(sanitized, 1); 
        } 
        string newFileName = String.Format("{0}{1}{2}", 
        System.IO.Path.GetFileNameWithoutExtension(sanitized), 
        filesCount[sanitized].ToString(), 
        System.IO.Path.GetExtension(sanitized)); 
        string newFilePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(sanitized), newFileName); 
        System.IO.File.Move(files2, newFilePath); 
        sanitized = newFileName; 

        DataGridViewRow clean = new DataGridViewRow(); 
        clean.CreateCells(dataGridView1); 
        clean.Cells[0].Value = pathOnly; 
        clean.Cells[1].Value = filenameOnly; 
        clean.Cells[2].Value = newFileName; 

        dataGridView1.Rows.Add(clean); 

       } 




       } 
      } 
      catch (Exception e) 
      { 
       errors.Write(e); 
      } 


    } 

    private void SanitizeFileNames_Load(object sender, EventArgs e) 
    { } 

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) 
    { 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Application.Exit(); 
    } 


} 

的問題是,一個重命名後,不是所有的文件將具有blankspaces相同數量。如在,我可以有Deal A&B.txt其中重命名後將成爲Deal A B.txt(1空間B /瓦A和B - 這很好)。但我也將有如下文件:Deal A & B & C.txt重命名後:Deal A   B   C.txt(A,B和C之間3個空格 - 不可接受)。

有沒有人有任何想法/代碼如何做到這一點?

回答

2

這有幫助嗎?

 var regex = new System.Text.RegularExpressions.Regex("\\s{2,}"); 
     var result = regex.Replace("Some text with a lot  of spaces, and 2\t\ttabs.", " "); 
     Console.WriteLine(result); 

輸出是:

Some text with a lot of spaces, and 2 tabs. 

它只是取代的2個或更多空白字符與單個空間中的任何序列...


編輯:

爲了澄清,我只是在你現有的正則表達式之後執行這個正則表達式:

public void Sanitizer(List<string> paths) 
{ 
    string regPattern = (@"[~#&$!%+{}]+"); 
    string replacement = " "; 

    Regex regExPattern = new Regex(regPattern); 
    Regex regExPattern2 = new Regex(@"\s{2,}"); 

和:

  foreach (string files2 in paths) 
      { 

      string filenameOnly = System.IO.Path.GetFileName(files2); 
      string pathOnly = System.IO.Path.GetDirectoryName(files2); 
      string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); 
      sanitizedFileName = regExPattern2.Replace(sanitizedFileName, replacement); // clean up whitespace 
      string sanitized = System.IO.Path.Combine(pathOnly, sanitizedFileName); 

我希望,更有意義。

+0

這是否需要一個新的foreach循環後,我完成了「消毒」文件? – yeahumok 2010-07-09 15:06:32

+0

@yeahumok請參閱我上面的修改。如果你現有的循環,只需在第一個之後添加第二個正則表達式。 – CodingWithSpike 2010-07-09 15:16:04

+0

非常感謝你!這工作,它完全有道理:)我感謝您的幫助! – yeahumok 2010-07-09 15:33:02

1

完成清理之後,只需用2個空格替換2個空格,而字符串中存在2個空格。

while (mystring.Contains(" ")) mystring = mystring.Replace(" "," "); 

我認爲這是正確的語法...

5

做的等值當地貨幣:

s/\s+/ /g; 
+0

+1我喜歡這個比字符串替換解決方案好一點。如果你已經在使用Regex的話,不妨繼續做下去。這具有清除所有空白(並且在一次通過中)而不是僅僅打空間的優點。在實踐中,我懷疑可讀性或性能會受到任何解決方案的影響,我懷疑他的文本實際上除了空格之外還會有其他任何空格。但是,這仍然是明智的。 – Brian 2010-07-09 15:23:11

1

可以執行另一個正則表達式替換後的第一個

@" +" -> " "

1

正如Fosco所說,格式化爲:

while (mystring.Contains(" ")) mystring = mystring.Replace(" "," "); 

//      ||         || | 
+0

我會在哪裏添加此聲明?我需要另一個foreach循環嗎? – yeahumok 2010-07-09 15:05:12

+0

你可以在設置'sanitizedFileName = regExPattern.Replace(filenameOnly,replacement);'並用它來代替'sanitizedFileName'後添加此語句。當然,還有其他地方可以放,但我認爲這是最好的選擇。 – Brian 2010-07-09 15:25:32

4

只需在您的regPattern中添加一個空格即可。任何無效字符和空格的集合都將被替換爲一個空格。您可能會浪費一點時間來替換空間,但另一方面,您不需要第二個字符串操作調用。

+0

+1:其他一些解決方案使用*多於兩個循環。當你可以在一個循環中完成整個工作時,爲什麼要麻煩呢? – 2010-07-09 15:40:07

+0

這對我有意義 - 你的正則表達式就像's/[&* ^] +// g',用空格替換任何_series_無效字符(包括空格)。 – 2010-07-09 15:40:09

+0

我放棄了這個想法,因爲它會錯過像'na!me $' – ULysses 2010-07-09 15:42:29