18
août
2010
string.Replace insensible à la casse
août
2010
La méthode String.Replace est sensible à la casse et contrairement à la méthode String.Compare elle ne possède pas de surcharge permettant de modifier ce comportement.
Je propose une méthode d’extension de la classe String qui permet de faire un Replace insensible à la casse :
Exemple :
string text = "Texte de départ";
//Méthode par défaut
Console.Write(text.Replace(text,"Texte","xxx")); //Résultat : xxx de départ
Console.Write(text.Replace(text,"texte","xxx")); //Résultat : Texte de départ
//Méthode d'extensio
Console.Write(text.Replace(text,"Texte","xxx", true)); //Résultat : xxx de départ
Console.Write(text.Replace(text,"texte","xxx", true)); //Résultat : xxx de départ
//Méthode par défaut
Console.Write(text.Replace(text,"Texte","xxx")); //Résultat : xxx de départ
Console.Write(text.Replace(text,"texte","xxx")); //Résultat : Texte de départ
//Méthode d'extensio
Console.Write(text.Replace(text,"Texte","xxx", true)); //Résultat : xxx de départ
Console.Write(text.Replace(text,"texte","xxx", true)); //Résultat : xxx de départ
Le code source de la méthode est sur mon site :
http://www.michaelalbaladejo.com/post/2010/07/28/string-Replace-non-sensible-a-la-casse.aspx
Salut,
Juste une remarque quand à l’utilisation des regexps : je vois que la valeur en entrée (oldValue) est bien protégé via l’appel à Regex.Escape()
Or ce n’est pas le cas de la valeur de remplacement (newValue). Or cette dernière peut également contenir des meta-caractères ( et $ uniquement si je ne me trompe pas). Si on ne les protège pas cela pourrait engendrer des erreurs.
a++
Merci pour vos remarques.
Suite a un conseil de Marsup j’ai modifié le code.
Maintenant je fais comme ça :
public static string Replace(this string value
, string oldValue, string newValue
, bool ignoreCase)
{
if (!ignoreCase)
{
return value.Replace(oldValue, newValue);
}
else
{
return Regex.Replace(value, Regex.Escape(oldValue)
, newValue, RegexOptions.IgnoreCase);
}
}
Personnellement,
J’utilise cette version qui est en moyenne deux fois plus rapide à l’exécution :
public static string Replace(this string value <br />
, string oldValue, string newValue <br />
, StringComparison comparison) <br />
{ <br />
StringBuilder sb; <br />
int i; <br />
int delta; <br />
<br />
sb = new StringBuilder(value); <br />
<br />
delta = 0; <br />
i = value.IndexOf(oldValue, comparison); <br />
while (i != -1) <br />
{ <br />
sb.Remove(i + delta, oldValue.Length); <br />
sb.Insert(i + delta, newValue); <br />
<br />
delta += (newValue.Length - oldValue.Length); <br />
i = value.IndexOf(oldValue, i + oldValue.Length, comparison); <br />
} <br />
<br />
return sb.ToString(); <br />
} <br />
Un autre cas posant problème :
pour « T[5].X », le remplacement de « [5] » par « (5) » ne fonctionne pas.
La regex est égale à ([[[][55][]]])
Salut,
comme chaque caractère est dupliqué ([aA]), le métacaractère ^ pose problème.
Si, pour « p^.X=10″, je compte remplacer ‘p^’ par ‘objet’ la classe de caractère qui est construite est [^^]. Du coup la regex échoue.
Script Powershell :
$regxExpression="(" <br />
$text = "p^.X=10"; <br />
[char[]]"p^"|% {$regxExpression+="[{0}{1}]" -f ($_ -as [String]).ToLower(), ($_ -as [String]).ToUpper()} <br />
$regxExpression+=")" <br />
$regxExpression <br />
[System.Text.RegularExpressions.Regex]::Replace($Text,$regxExpression,"Objet") <br />