2009-05-19 15 views
6

次の例を考えてみましょう。C#で特定の単語を置き換えるにはどうすればよいですか?

string s = "The man is old. Them is not bad."; 

そして、それは"@@ man is old. @@m is not bad."
を返し、私は

s = s.Replace("The", "@@"); 

を使用しかし、私は、出力は私がこれを行うことができますどのように"@@ man is old. Them is not bad."

になりたい場合は?

+0

なぜタイトルが正規表現を含めるように編集されましたか?テキスト置換を行う方法は、もっと多くあります。私は通常それが遅いのでRegexを避けるようにしています。タイトルは "仮定された"答えを含むように編集されていたはずです。 – Crispy

+1

@Chris Persichetti:それは十分です。私はタイトルから "正規表現"を削除しました。 (私はタグに基づいて追加しましたが、 "正規表現"は明らかに元のタグの1つではありませんでした) –

答えて

3

s = s.Replace( "The"、 "@@");ここで

23

は、任意の単語の境界を扱うだろう正規表現を、使用したい方法は次のとおりです。

Regex r = new Regex(@"\bThe\b"); 
s = r.Replace(s, "@@"); 
4

私はタイトルは正規表現を使用することになったと仮定するように変更された理由を尋ね上記のコメントをしました。

私は個人的に遅いので、Regexを使用しないようにしてください。 Regexは複雑な文字列パターンには最適ですが、文字列の置換が単純で、その中からいくつかのパフォーマンスが必要な場合は、Regexを使わずに方法を見つけようとします。

一緒にテストしました。 Regexと文字列メソッドで100万個の置換えを実行する

正規表現は26.5秒で完了しました。が完了すると、文字列メソッドは8秒になりました。

 //Using Regex. 
     Regex r = new Regex(@"\b[Tt]he\b"); 

     System.Diagnostics.Stopwatch stp = System.Diagnostics.Stopwatch.StartNew(); 

     for (int i = 0; i < 1000000; i++) 
     { 
      string str = "The man is old. The is the Good. Them is the bad."; 
      str = r.Replace(str, "@@"); 
     } 

     stp.Stop(); 
     Console.WriteLine(stp.Elapsed); 

     //Using String Methods. 
     stp = System.Diagnostics.Stopwatch.StartNew(); 

     for (int i = 0; i < 1000000; i++) 
     { 
      string str = "The man is old. The is the Good. Them is the bad."; 

      //Remove the The if the stirng starts with The. 
      if (str.StartsWith("The ")) 
      { 
       str = str.Remove(0, "The ".Length); 
       str = str.Insert(0, "@@ "); 
      } 

      //Remove references The and the. We can probably 
      //assume a sentence will not end in the. 
      str = str.Replace(" The ", " @@ "); 
      str = str.Replace(" the ", " @@ "); 
     } 

     stp.Stop(); 
     Console.WriteLine(stp.Elapsed); 
+2

与えられたデータに対して、より冗長な解決策が働きます。しかし、正規表現は句読点のような区切り文字を扱う単語区切りを見つけるために書くことができるのに対し、OP文を使用する場合は、(あまりにも遅い)正規表現を使用するよりも簡潔であるだけでなく、コードが失敗したり、スペースの代わりにマークを使用します。詳細については、@ auujayの投稿に対するコメントを参照してください。 – JeffH

+1

私はそれが一般的な解決策ではないことを知っています。 Regexソリューションは、一般的な単語の安全性のための優れたソリューションです。私は主に、正規表現は必ずしも正確に必要なものに依存しているわけではないことを指摘しようとしていました。私はこのような質問をして、テキスト置換のヒントを手に入れようとしています。私のプロジェクトは多くのテキスト置換を行い、私はいつもより速い方法でそれを探しています。だから私はタイトルがRegexに変わったときに私のプロジェクトに正規表現のソリトンを必要としないので失望したので、この答えを投稿したのです。 – Crispy

+0

@Crispy、あなたはパフォーマンス時間だけ見ることはできません。ソフトウェアは高速度で動作するだけでなく、可読性を気にしなければ、より速いソフトウェアを作成しますが、保守して進化させるのに非常に広範囲です。 –

0

C#コンソールアプリケーション

static void Main(string[] args) 

     { 
      Console.Write("Please input your comment: "); 
      string str = Console.ReadLine(); 
      string[] str2 = str.Split(' '); 
      replaceStringWithString(str2); 
      Console.ReadLine(); 
     } 
     public static void replaceStringWithString(string[] word) 
     { 
      string[] strArry1 = new string[] { "good", "bad", "hate" }; 
      string[] strArry2 = new string[] { "g**d", "b*d", "h**e" }; 
      for (int j = 0; j < strArry1.Count(); j++) 
      { 
       for (int i = 0; i < word.Count(); i++) 
       { 
        if (word[i] == strArry1[j]) 
        { 
         word[i] = strArry2[j]; 
        } 
        Console.Write(word[i] + " "); 
       } 
      } 
     } 
関連する問題