Une sorte de groupe de réponses déroutant, en partie parce que le titre de la question est en réalité beaucoup plus large que la question spécifique posée. Après avoir lu, je ne suis pas sûr qu'une réponse soit à quelques modifications de l'assimilation de toutes les bonnes choses ici, alors j'ai pensé que j'essaierais de résumer.
Voici une méthode d'extension qui, je pense, évite les pièges mentionnés ici et fournit la solution la plus largement applicable.
public static string ReplaceCaseInsensitiveFind(this string str, string findMe,
string newValue)
{
return Regex.Replace(str,
Regex.Escape(findMe),
Regex.Replace(newValue, "\\$[0-9]+", @"$$$0"),
RegexOptions.IgnoreCase);
}
Alors...
Malheureusement, le commentaire de @HA que vous devez faire aux Escape
trois n'est pas correct . La valeur initiale et newValue
n'a pas besoin d'être.
Remarque: Cependant, vous devez échapper les $
s dans la nouvelle valeur que vous insérez s'ils font partie de ce qui semble être un marqueur de "valeur capturée" . Ainsi, les trois signes du dollar dans le Regex.Replace à l'intérieur du Regex.Replace [sic]. Sans cela, quelque chose comme ça se casse ...
"This is HIS fork, hIs spoon, hissssssss knife.".ReplaceCaseInsensitiveFind("his", @"he$0r")
Voici l'erreur:
An unhandled exception of type 'System.ArgumentException' occurred in System.dll
Additional information: parsing "The\hisr\ is\ he\HISr\ fork,\ he\hIsr\ spoon,\ he\hisrsssssss\ knife\." - Unrecognized escape sequence \h.
Dites-vous quoi, je sais que les gens qui sont à l'aise avec Regex ont l'impression que leur utilisation évite les erreurs, mais je reste souvent partial pour les chaînes de reniflement d'octets (mais seulement après avoir lu Spolsky sur les encodages ) pour être absolument sûr que vous obtenez ce que vous destiné aux cas d'utilisation importants. Ça me rappelle un peu Crockford sur les " expressions régulières peu sûres ". Trop souvent, nous écrivons des expressions rationnelles qui permettent ce que nous voulons (si nous avons de la chance), mais en autorisons involontairement plus (par exemple, est-ce $10
vraiment une chaîne de "valeur de capture" valide dans mon expression rationnelle newValue, ci-dessus?) Parce que nous n'étions pas assez réfléchis . Les deux méthodes ont de la valeur et encouragent toutes deux différents types d'erreurs involontaires. Il est souvent facile de sous-estimer la complexité.
Cette $
fuite étrange (et qui Regex.Escape
n'a pas échappé aux modèles de valeur capturés $0
comme je m'y attendais dans les valeurs de remplacement) m'a rendu fou pendant un certain temps. La programmation est difficile (c) 1842