2009-05-19 19 views
6

Considerare il seguente esempio.Come posso sostituire una parola specifica in C#?

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

Se uso

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

Poi ritorna "@@ man is old. @@m is not bad."
Ma voglio l'uscita sia "@@ man is old. Them is not bad."

Come posso fare questo?

+0

Perché il titolo modificato per includere Regex? C'è più di un modo per fare la sostituzione del testo. Di solito cerco di evitare Regex perché è lento, quindi non penso che il titolo avrebbe dovuto essere modificato per includere la risposta "assunta". – Crispy

+1

@ Chris Persichetti: Questo è abbastanza giusto; Ho rimosso "regex" dal titolo. (L'avevo aggiunto in base ai tag, ma "regex" a quanto pare non era comunque uno dei tag originali.) –

risposta

23

Ecco come devi usare una regex, che avrebbe gestito eventuali confini di parola:

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

ho fatto un commento sopra chiedendo perché il titolo è stato cambiato ad assumere Regex doveva essere usato.

Io personalmente provo a non usare Regex perché è lento. Regex è ottimo per schemi di stringhe complessi, ma se le sostituzioni di stringhe sono semplici e hai bisogno di prestazioni, cercherò di trovare un modo senza utilizzare Regex.

Ha unito una prova. Esecuzione di un milione di sostituzioni con Regex e metodi di stringa.

Regex ha 26,5 secondi per completare, metodi delle stringhe hanno 8 secondi per completare.

 //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

Per i dati forniti la soluzione più prolissa funziona. Ma oltre ad essere meno conciso rispetto all'utilizzo di una regex (certamente lenta), il tuo codice fallirà o richiederà un aggiornamento se l'OP vuole usarlo in un senso più generale, mentre una regex può essere scritta per trovare interruzioni di parole che gestiranno separatori come la punteggiatura segna invece di solo spazi. Vedi il mio commento sul post di @ auujay per informazioni specifiche. – JeffH

+1

So che non è una soluzione generica. La soluzione Regex è una soluzione migliore per la sicurezza per le parole generiche. Stavo principalmente cercando di sottolineare che la regex non è sempre la soluzione dipende solo da ciò che è necessario esattamente. Cerco di guardare domande come questa per raccogliere suggerimenti per la sostituzione del testo, dato che il mio progetto esegue molti rimpiazzi di testo e cerco sempre modi più rapidi per farlo. Quindi sono rimasto deluso quando il titolo è stato cambiato in Regex perché non voglio un soluiton regex per il mio progetto, ecco perché ho postato questa risposta. – Crispy

+0

@Crispy, non puoi guardare solo sui tempi di esecuzione, il software non è solo veloce da eseguire, se non ti preoccupi di Legibilità, Manutenibilità creerai un software più veloce ma molto espansivo da mantenere e da evolvere. –

0

C# applicazione console

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] + " "); 
       } 
      } 
     } 
Problemi correlati