2008-09-22 21 views
19

Así que estaba escribiendo algo de código hoy que básicamente tiene el siguiente aspecto:alternativa a String.Replace

string returnString = s.Replace("!", " ") 
      .Replace("@", " ") 
      .Replace("#", " ") 
      .Replace("$", " ") 
      .Replace("%", " ") 
      .Replace("^", " ") 
      .Replace("*", " ") 
      .Replace("_", " ") 
      .Replace("+", " ") 
      .Replace("=", " ") 
      .Replace("\", " ") 

Lo cual no es muy agradable. Me preguntaba si hay una expresión regular o algo que podría escribir que reemplazaría todas las llamadas a la función Replace().

+0

@lomaxx: Vea la solución de Dimitre, lo que evita el uso de expresiones regulares en absoluto. –

+0

@dimitre ¿dónde está? o_O – cregox

+0

@Cawas: aquí: http://dnovatchev.spaces.live.com/blog/cns!44B0A32C2CCF7488!353.entry ver una descripción de la función de traducir XPath() aquí: http: // www. w3.org/TR/xpath-functions/# func-translate –

Respuesta

33

Puede usar Regex.Replace(). Todos los caracteres se pueden colocar entre corchetes, que coinciden con cualquier carácter entre los corchetes. Algunos caracteres especiales tienen que ser escapados con barras diagonales inversas, y yo uso una cadena @verbatim aquí, así que no tengo que escabullirlos para el compilador C#. El primer parámetro es la cadena de entrada y el último parámetro es la cadena de reemplazo.

var returnString = Regex.Replace(s,@"[[email protected]#\$%\^*_\+=\\]"," "); 
0
s/[[email protected]#$%^*_+=\]//

sería la expresión regular por ello ... en C# debe ser capaz de utilizar

Regex.Replace(yourstring, "[[email protected]#$%^*_+=\]", ""); 

Aunque mi C# es oxidado ..

2

FYI - si es necesario Para modificar esta expresión regular, deberá comprender el lenguaje de expresiones regulares. Es bastante simple, y como desarrollador realmente se debe a usted mismo agregar expresiones regulares a su caja de herramientas; no las necesita todos los días, pero si puede aplicarlas adecuadamente cuando sea necesario cuando surja la necesidad, le devolverán el dinero. diez veces para el esfuerzo inicial. Aquí hay un enlace a un sitio web con algunos tutoriales de primer nivel, fáciles de seguir y material de referencia sobre expresiones regulares: regular-expressions.info. Una vez que tenga una idea de las expresiones regulares y quiera usarlas en su software, querrá comprar Regex Buddy. Es una herramienta barata y extraordinaria para aprender y usar expresiones regulares. I muy rara vez compra herramientas de desarrollo, pero esta vale cada centavo. Está aquí: Regex Buddy

0

Si no le interesa profundizar en Regex, aquí hay un par de otras posibilidades de métodos de extensión.

se puede pasar en los caracteres específicos que desea reemplazar:

static public string ReplaceCharsWithSpace(this string original, string chars) 
{ 
    var result = new StringBuilder(); 
    foreach (var ch in original) 
    { 
     result.Append(chars.Contains(ch) ? ' ' : ch); 
    } 
    return result.ToString(); 
} 

O si usted sabe que quiere sólo para mantener o sólo se tira a determinados tipos de caracteres, puede utilizar los diversos métodos de char, como IsLetter, IsDigit, IsPunctuation y IsSymbol:

static public string ReplaceNonLetterCharsWithSpace(this string original) 
{ 
    var result = new StringBuilder(); 
    foreach (var ch in original) 
    { 
     result.Append(char.IsLetter(ch) ? ch : ' '); 
    } 
    return result.ToString(); 
} 

te mostramos cómo utilizar cada una de estas posibilidades:

string s = "ab!2c"; 
s = s.ReplaceCharsWithSpace(@"[email protected]#$%^*_+=/"); // s contains "ab c" 

string t = "ab3*c"; 
t = t.ReplaceNonLetterCharsWithSpace(); // t contains "ab c" 
+0

Me pregunto cuál funcionaría más rápido: esto o la expresión regular – cregox

0

Tal vez usted puede reducir esto a un par de líneas, si se desea, mediante el uso de una expresión lambda y List<>, ForEach

using System.Collections.Generic; 

namespace ReplaceWithSpace 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string someString = "#1, 1+1=2 $string$!"; 

      var charsToRemove = new List<char>(@"[email protected]#$%^*_+=\"); 
      charsToRemove.ForEach(c => someString = someString.Replace(c, ' ')); 

      System.Diagnostics.Debug.Print(someString); //" 1, 1 1 2 string " 
     } 
    } 

} 
+0

El problema con este enfoque es una Se generan muchas cadenas intermedias para cada carácter reemplazado. Este es el mismo problema que tuvo la solución original que resuelve la solución de expresiones regulares. – Duncan