J'ai une chaîne appelée "hello world"
J'ai besoin de remplacer le mot "monde" par "csharp"
pour cela j'utilise:
string.Replace("World", "csharp");
mais en conséquence, je ne fais pas remplacer la chaîne. La raison en est la sensibilité à la casse. La chaîne d'origine contient "world" alors que j'essaie de remplacer "World".
Existe-t-il un moyen d'éviter cette sensibilité à la casse dans la méthode string.Replace?
Réponses:
Vous pouvez utiliser un Regex et effectuer un remplacement insensible à la casse:
la source
hello. world?
ou autre chose contenant des opérateurs regex.Le Regex.Escape est utile si vous comptez sur l' entrée d'utilisateur qui peut contenir des éléments de langage Regex
Mettre à jour
Grâce aux commentaires, vous n'avez en fait pas besoin d'échapper à la chaîne de remplacement.
Voici un petit violon qui teste le code :
Sa sortie est:
la source
Regex.Escape
est mauvaise, elle préfixera les caractères spéciaux avec des barres obliques inverses. On dirait que la meilleure façon est .Replace ("$", "$$"), qui est un peu stupide ( stackoverflow.com/a/10078353 ).Méthode 2.5X PLUS RAPIDE et PLUS EFFICACE que les autres méthodes d'expressions régulières:
Remarque: ignorez la casse ==
StringComparison.OrdinalIgnoreCase
comme paramètre pourStringComparison comparisonType
. C'est le moyen le plus rapide et insensible à la casse de remplacer toutes les valeurs.Avantages de cette méthode:
newValue
surnull
), optimisé pour cela;string.Replace
, mêmes exceptions;Benchmark-proof : cette solution est 2,59 fois plus rapide que regex de @Steve B., code:
Idée originale - @ Darky711; merci @MinerR pour
StringBuilder
.la source
String
. Cependant, leStringBuilder
est vraiment plus rapide de 30 à 40% que leString
. J'ai mis à jour la solution. Merci;)Les extensions nous facilitent la vie:
la source
Beaucoup de suggestions en utilisant Regex. Que diriez-vous de cette méthode d'extension sans elle:
la source
comparison
doit être utilisé dansIndexOf
, au lieu deStringComparison.CurrentCultureIgnoreCase
if(old.Equals(@new, comparison)) return @new;
car la nouvelle chaîne peut différer en majuscules / minuscules.Vous pouvez utiliser l' espace de noms Microsoft.VisualBasic pour trouver cette fonction d'assistance:
la source
( Modifié: n'était pas au courant du problème du "lien nu", désolé)
Extrait d' ici :
Semble que vous n'êtes pas le premier à vous plaindre de l'absence de chaîne insensible à la casse.
la source
Modification de la réponse de @ Darky711 pour utiliser le type de comparaison passé et faire correspondre le cadre remplacer les noms et les commentaires xml aussi étroitement que possible.
la source
J'ai écrit la méthode d'extension:
J'utilise deux méthodes d'extension supplémentaires pour la méthode d'extension précédente:
la source
IsNot
prend les extensions trop au sérieux :).IsNot
Étendre la réponse de Petrucio avec
Regex.Escape
sur la chaîne de recherche et échapper au groupe correspondant comme suggéré dans la réponse de Steve B (et quelques changements mineurs à mon goût):Ce qui produira les résultats attendus suivants:
Cependant, sans effectuer les échappements, vous obtiendriez ce qui suit, ce qui n'est pas un comportement attendu d'un
String.Replace
qui est juste insensible à la casse:la source
Cela ne fonctionne-t-il pas: je ne peux pas imaginer que quoi que ce soit d'autre soit beaucoup plus rapide ou plus facile.
la source
La fonction ci-dessous consiste à supprimer tous les mots de correspondance comme (this) de l'ensemble de chaînes. Par Ravikant Sonare.
la source
En utilisant la solution @Georgy Batalov, j'ai eu un problème lors de l'utilisation de l'exemple suivant
chaîne d'origine = "blah, DC = bleh, DC = blih, DC = bloh, DC = com"; chaîne remplacée = original.ReplaceIgnoreCase (", DC =", ".")
Voici comment j'ai réécrit son extension
la source
ci-dessous est l'alternative pour remplacer la chaîne en ignorant la casse des caractères
la source
Vous pouvez également essayer la
Regex
classe.var regex = new Regex( "camel", RegexOptions.IgnoreCase ); var newSentence = regex.Replace( sentence, "horse" );
la source
Je préfère ceci - "Hello World" .ToLower (). Replace ("world", "csharp");
la source