2012-05-06 139 views
2

我有一串由([ \\t{}():;.,،\"\n])分隔的字。如何將該字符串拆分爲StringBuilder,同時刪除與模式@"\d|\s|/|-"匹配的任何單詞,並刪除長度小於2個字符的所有單詞。最後,我想把它存儲回字符串。拆分字符串到字符串biulder刪除所有字符匹配模式

Regex r = new Regex("([ \\t{}():;.,،\"\n])"); 

    String[] tokens = r.Split(sb.ToString()); 
    List<string> filter = new List<string>(); 
    for (int i = 0; i < tokens.Length; i++) 
    { 
     ........................ 
     { 
      ..................... 
     } 


    } 

    ................ 

    return builder.ToString(); 
+0

嘗試從第二個正則表達式中創建一個RegEx實例,並在該循環中對所有對IsMatch的調用使用同一個實例。也許這會加快速度。 –

+0

是否可以用快速的Linq代碼來完成? –

+0

你能提供一個示例輸入字符串和期望的輸出嗎? –

回答

0

我想出了這個。除了我使用LINQ並避免使用StringBuidler之外,它與您的解決方案沒有什麼不同。你會接受嗎?

using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

class Program { 
    static void Main(string[] args) { 
     string value = "one or:another{3}"; 
     Regex exclude = new Regex(@"\d|\s|/|-", RegexOptions.Compiled); 
     string final = string.Join(" ", 
      (from s in Regex.Split(value, "([ \\t{}():;.,،\"\n])") 
       where s.Length > 2 && !exclude.IsMatch(s) 
       select s.Replace("ه‌","ه")).ToArray()); 

     // to get the List<string> instead: 
     List<string> l = (from s in Regex.Split(value, "([ \\t{}():;.,،\"\n])") 
      where s.Length > 2 && !exclude.IsMatch(s) 
      select s.Replace("ه‌","ه")).ToList(); 
    } 
} 
+0

你的代碼可以執行得更快嗎?我應該試試。 –

+0

但我想存回字符串。 –

+0

那麼,測試一下你的真實投入。我認爲這只是避免一些不必要的步驟(StringBuilder位,列表),但我不認爲它會快速發展。如果你的目標是速度,那麼也許更低的水平會更好? –

0

該代碼看起來不錯。正則表達式處理確實需要很長時間。也許嘗試創建@"\d\s|/|-"作爲Regex m = new Regex( @「\ d \ s |/| - 」);`在頂部避免在每一圈重新分析它。

+0

對我來說不是專業,螞蟻的建議提高? –

+0

理想情況下,這將作爲基於集合的操作而不是循環來提​​高速度和效率 - O(1)而不是O(n)。也許嘗試重新格式化爲LINQ或將其移入存儲過程 - 這兩個都是基於集合的環境。 – robrich