2009-05-19 4 views
6

Considérons l'exemple suivant.Comment puis-je remplacer un mot spécifique en C#?

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

Si je

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

Ensuite, il retourne "@@ man is old. @@m is not bad."
Mais je veux que la sortie soit "@@ man is old. Them is not bad."

Comment puis-je faire cela?

+0

Pourquoi at-on le titre modifié pour inclure Regex? Il y a plus d'une façon de faire du remplacement de texte. J'essaie généralement d'éviter Regex parce que c'est lent, donc je ne pense pas que le titre aurait dû être édité pour inclure la réponse "assumé". – Crispy

+1

@Chris Persichetti: C'est assez juste; J'ai supprimé "regex" du titre. (Je l'avais ajouté en fonction des balises, mais "regex" n'était apparemment pas l'un des balises originales de toute façon.) –

Répondre

23

Voilà comment vous utiliseriez une expression rationnelle, qui traiterait des limites de mots:

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

J'ai fait un commentaire ci-dessus se demander pourquoi le titre a été changé pour assumer Regex devait être utilisé.

Personnellement, j'essaie de ne pas utiliser Regex parce que c'est lent. Regex est idéal pour les modèles de chaînes complexes, mais si les remplacements de chaînes sont simples et que vous avez besoin de performances, je vais essayer de trouver un moyen sans utiliser Regex.

Jeter ensemble un test. Exécuter un million de remplacements avec des méthodes Regex et chaîne.

Regex a 26,5 secondes pour compléter, les méthodes de chaîne ont 8 secondes pour terminer.

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

Pour les données données, votre solution plus verbeuse fonctionne. Mais en plus d'être moins concis que d'utiliser une regex (certes lente), votre code va échouer ou nécessiter une mise à jour si l'OP veut l'utiliser dans un sens plus général, alors qu'une regex peut être écrite pour trouver des séparations comme la ponctuation marques au lieu de seulement des espaces. Voir mon commentaire sur le poste @ auujay pour plus de détails. – JeffH

+1

Je sais que ce n'est pas une solution générique. La solution Regex est une meilleure solution pour la sécurité des mots généraux. J'essayais surtout de faire remarquer que regex n'est pas toujours la solution dépend juste de ce qui est nécessaire exactement. J'essaie de regarder des questions comme celle-ci pour obtenir des conseils sur le remplacement de texte, car mon projet fait beaucoup de remplacement de texte et je suis toujours à la recherche de moyens plus rapides de le faire. J'ai donc été déçu quand le titre a été changé en Regex parce que je ne veux pas de regex soluiton pour mon projet, c'est pourquoi j'ai posté cette réponse. – Crispy

+0

@Crispy, vous ne pouvez pas regarder seulement sur les temps de performance, le logiciel n'est pas seulement courir vite, si vous ne vous embêtez pas avec la lisibilité, vous allez créer un logiciel plus rapide mais très expansif à conserver et à développer. –

0

C# Application 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] + " "); 
       } 
      } 
     } 
Questions connexes