2009-05-19 22 views
6

Considere el siguiente ejemplo.¿Cómo puedo reemplazar una palabra específica en C#?

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

Si uso

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

Luego vuelve "@@ man is old. @@m is not bad."
Pero quiero que la salida sea "@@ man is old. Them is not bad."

¿Cómo puedo hacer esto?

+0

¿Por qué fue el título editado para incluir expresiones regulares? Hay más de una forma de reemplazar el texto. Normalmente trato de evitar Regex porque es lento, así que no creo que el título debería haber sido editado para incluir la respuesta "asumida". – Crispy

+1

@Chris Persichetti: Eso es suficiente; Eliminé "regex" del título. (Lo había agregado basado en las etiquetas, pero aparentemente "regex" no era una de las etiquetas originales.) –

Respuesta

23

Así es como tendría que utilizar una expresión regular, que se ocuparía de cualquier límites de las palabras:

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

hice un comentario anterior preguntando por qué el título fue cambiado a asumir expresiones regulares se iba a utilizar.

Personalmente trato de no usar Regex porque es lento. Regex es ideal para patrones complejos de cuerdas, pero si los reemplazos de cuerdas son simples y necesita un poco de rendimiento, intentaré encontrar un camino sin usar Regex.

Hicieron una prueba juntos. Ejecutando un millón de reemplazos con Regex y métodos de cadena.

Regex tomó 26,5 segundos para completar, métodos de cadena tomaron 8 segundos para completar.

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

Para los datos dados, su solución más detallada funciona. Pero además de ser menos conciso que usar una expresión regular (por cierto lenta), su código fallará o requerirá actualización si el OP desea usarlo en un sentido más general, mientras que una expresión regular puede escribirse para encontrar saltos de palabra que manejarán separadores como la puntuación marcas en lugar de solo espacios Vea mi comentario en la publicación de @ auujay para detalles. – JeffH

+1

Sé que no es una solución genérica. La solución Regex es una mejor solución para la seguridad de palabras generales. Intenté principalmente señalar que la expresión regular no siempre es la solución sino que depende de lo que se necesita exactamente. Intento y observo preguntas como esta para obtener consejos sobre el reemplazo de texto, ya que mi proyecto reemplaza mucho texto y siempre estoy buscando formas más rápidas de hacerlo. Así que me decepcionó cuando cambiaron el título a Regex porque no quiero una solución de expresiones regulares para mi proyecto, así que es por eso que publiqué esta respuesta. – Crispy

+0

@Crispy, no puedes mirar solo los tiempos de rendimiento, el software no solo trata de correr rápido, si no te molestas con Legibilidad, Manutenibilidad crearás un software más rápido pero muy expansivo para mantener y evolucionar. –

0

C# aplicación de consola de

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] + " "); 
       } 
      } 
     } 
Cuestiones relacionadas