2008-09-22 19 views
19

J'écrivait aujourd'hui un certain code qui ressemble fondamentalement ceci:Alternative à String.Replace

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

Ce qui est pas vraiment agréable. Je me demandais s'il y avait une regex ou quelque chose que je pourrais écrire qui remplacerait tous les appels à la fonction Replace()?

+0

@lomaxx: Voir la solution de Dimitre, ce qui évite l'utilisation expressions rationnelles. –

+0

@dimitre où est-ce? o_O – cregox

+0

@Cawas: Ici: http://dnovatchev.spaces.live.com/blog/cns!44B0A32C2CCF7488!353.entry Voir la description de la fonction XPath traduire ici(): http: // www. w3.org/TR/xpath-functions/# func-translate –

Répondre

33

Vous pouvez utiliser Regex.Replace(). Tous les caractères peuvent être placés entre crochets, ce qui correspond à n'importe quel caractère entre les crochets. Certains caractères spéciaux doivent être échappés avec des barres obliques inverses, et j'utilise une chaîne @verbatim ici, donc je n'ai pas besoin de double-échapper pour le compilateur C#. Le premier paramètre est la chaîne d'entrée et le dernier paramètre est la chaîne de remplacement.

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

serait le regex pour elle ... en C#, vous devriez être en mesure d'utiliser

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

Bien que mon C# est rouillé ..

2

Pour votre information - si vous avez besoin Pour modifier cette regex, vous devez avoir une compréhension du langage d'expression régulière. C'est très simple, et en tant que développeur, vous vous devez vraiment d'ajouter des expressions régulières à votre boîte à outils - vous n'en avez pas besoin tous les jours, mais être capable de les appliquer lorsque cela est nécessaire vous rapportera décuplé pour l'effort initial. Voici un lien vers un site Web avec des didacticiels de premier ordre, faciles à suivre et du matériel de référence sur les expressions régulières: regular-expressions.info. Une fois que vous aurez une idée des expressions régulières et que vous voudrez les utiliser dans votre logiciel, vous voudrez acheter Regex Buddy. C'est un outil bon marché et extraordinaire pour apprendre et utiliser des expressions régulières. I très rarement acheter des outils de développement, mais celui-ci valait chaque centime. C'est ici: Regex Buddy

0

Si vous ne voulez pas vous plonger dans Regex, voici quelques autres possibilités d'extension.

Vous pouvez passer les caractères spécifiques que vous souhaitez remplacer:

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(); 
} 

Ou si vous savez que vous voulez garder seulement ou une bande que sur certains types de caractères, vous pouvez utiliser les différentes méthodes char, tels que IsLetter, IsDigit, IsPunctuation et 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(); 
} 

Voici comment vous utiliseriez chacune de ces possibilités:

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

Je me demande quel serait le plus rapide: ceci ou l'expression rationnelle – cregox

0

Peut-être que vous pouvez réduire cela à quelques lignes, si on le souhaite, en utilisant une expression lambda et 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

Le problème avec cette approche est un beaucoup de chaînes intermédiaires sont générées pour chaque caractère remplacé, ce qui pose le même problème que la question originale que la solution regex résout. – Duncan