2016-04-27 132 views
4

編輯刪除不想要的字符:這是我當前的代碼(21233664個字符)從一個巨大的文件

string str = myInput.Text; 
     StringBuilder sb = new StringBuilder(); 
     foreach (char c in str) 
     { 
      if ((c >= 'a' && c <= 'z') || c == '_' || c==' ') 
      { 
       sb.Append(c); 
      } 
     } 
     output.Text = sb.ToString(); 

比方說,我有一個包含特殊字符,並用下劃線正常表達一個巨大的文本文件。

這裏是我要找的的幾個例子:

  • super_test
  • 測試
  • another_super_test

正如你所看到的,只有小寫下劃線允許字母。 現在,如果我有這些字符串在一個文本文件看起來像這樣:

> §> ˜;@ ®> l? super_test D>ÿÿÿÿ 「G? tI> €[> €? È 

我現在面臨的問題是,有些寂寞信件仍然保存。在上面的例子中,輸出將是:

l super_test t 

若要纏身這些字符的,我必須再次經歷整個文件,但這裏是我的問題:我怎麼能知道一個字母是寂不寂寞

我不確定我是否理解正則表達式的可能性,所以如果任何人都可以給我一個提示,我會非常感激。

+2

我認爲這是非常肯定地說,信是寂寞的時候哭:-) – dasblinkenlight

+0

如何「寂寞「我們在說話嗎?您可以爲您的正則表達式添加最小長度要求。 – AntiTcb

+0

「巨​​大」有多大?你如何做你顯示的過濾? –

回答

6

你顯然需要一個正則表達式。一個簡單的方法是[a-z_]{2,},它採用所有小寫字母a到z的字母和下劃線至少2個字符長。

在解析大文件時一定要小心。巨大的,我想你使用某種緩衝區。你需要確保你在一個緩衝區中沒有得到一半的字,而在另一個緩衝區中卻沒有。

0

您不能像其他可接受的字符那樣對待空間。除了可以接受外,這個空間還可以作爲你寂寞人物的分隔符。 (這可能是所提出的正則表達式以及一個問題,我不能肯定地說。)無論如何,這個做什麼(我覺得)你想:

string str = "> §> ˜;@ ®> l? super_test D>ÿÿÿÿ 「G? tI> €[> €? È"; 
StringBuilder sb = new StringBuilder(); 
char? firstLetterOfWord = null; 
foreach (char c in str) 
{ 
    if ((c >= 'a' && c <= 'z') || c == '_') 
    { 
     int length = sb.Length; 
     if (firstLetterOfWord != null) 
     { 
      // c is the second character of a word 
      sb.Append(firstLetterOfWord); 
      sb.Append(c); 
      firstLetterOfWord = null; 
     } 
     else if (length == 0 || sb[length - 1] == ' ') 
     { 
      // c is the first character of a word; save for next iteration 
      firstLetterOfWord = c; 
     } 
     else 
     { 
      // c is part of a word; we're not first, and prev != space 
      sb.Append(c); 
     } 
    } 
    else if (c == ' ') 
    { 
     // If you want to eliminate multiple spaces in a row, 
     // this is the place to do so 
     sb.Append(' '); 
     firstLetterOfWord = null; 
    } 
    else 
    { 
     firstLetterOfWord = null; 
    } 
} 

Console.WriteLine(sb.ToString()); 

它與單身和完整的單詞在字符串的開始和結束。

如果您的輸入包含諸如[email protected]之類的內容,則輸出將一起運行(onetwo,沒有中間空格)。假設這是不是你想要的,也假設你有一排不需要多個空格:

StringBuilder sb = new StringBuilder(); 
bool previousWasSpace = true; 
char? firstLetterOfWord = null; 
foreach (char c in str) 
{ 
    if ((c >= 'a' && c <= 'z') || c == '_') 
    { 
     if (firstLetterOfWord != null) 
     { 
      sb.Append(firstLetterOfWord).Append(c); 
      firstLetterOfWord = null; 
      previousWasSpace = false; 
     } 
     else if (previousWasSpace) 
     { 
      firstLetterOfWord = c; 
     } 
     else 
     { 
      sb.Append(c); 
     } 
    } 
    else 
    { 
     firstLetterOfWord = null; 
     if (!previousWasSpace) 
     { 
      sb.Append(' '); 
      previousWasSpace = true; 
     } 
    } 
} 

Console.WriteLine(sb.ToString());