2016-04-27 23 views
4

EDITを、不要な文字を削除します。ここに私の現在のコード(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

方法」:-)泣いている時に文字が孤独であると言うことはかなり安全だと思います寂しい "と話していますか? Regexに最小長さの要件を追加することができます。 – AntiTcb

+0

「巨大」の大きさはどれくらいですか?どのようにフィルタリングを行うのですか? –

答えて

6

明らかに正規表現が必要です。単純なものは[a-z_]{2,}で、これは小文字のすべての文字列をz文字にし、下線を少なくとも2文字にします。

大きなファイルを解析するときには注意してください。巨大なので、あなたはある種のバッファを使用すると思います。 1つのバッファに半分の単語を入れ、次の単語に半分の単語を入れないようにする必要があります。

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()); 
関連する問題