Veuillez publier des messages clairs que les gens peuvent comprendre. J'ai aussi édité celui-ci pour vous. Vous devriez avoir spécifié une langue au moins ici.
GEOCHET
Bien sûr, elle n'est jamais remplacée ... c'est toujours une nouvelle chaîne contenant l'original avec du texte remplacé. C'est parce que les chaînes sont immuables.
Pablo Marambio
J'ai essayé la méthode `String.Replace ()`. mais il remplace tous les "AA" par "XQ"
string str ="The brown brown fox jumps over the lazy dog";
str =ReplaceFirst(str,"brown","quick");
EDIT : Comme @itsmatt l'a mentionné , il y a aussi Regex.Replace (String, String, Int32), qui peut faire la même chose, mais est probablement plus cher à l'exécution, car il utilise un analyseur complet où ma méthode fait une recherche et trois chaînes concaténations.
EDIT2 : S'il s'agit d'une tâche courante, vous souhaiterez peut-être faire de la méthode une méthode d'extension:
publicstaticclassStringExtension{publicstaticstringReplaceFirst(thisstring text,string search,string replace){// ...same as above...}}
En utilisant l'exemple ci-dessus, il est maintenant possible d'écrire:
Intéressant, avez-vous testé votre hypothèse selon laquelle l'approche regex est plus chère à l'exécution? Et la vitesse? Peut-être que la recherche avec Regex est plus rapide qu'avec IndexOf?
mfloryan le
Je préfère un peu la réponse de @BilltheLizard impliquant Remove () et Insert () à cette approche impliquant Substring (). Y a-t-il une raison de dire que l'un est meilleur que l'autre?
JohnC
3
Attention: cela ne fonctionne pas correctement avec Unicode combinant des caractères ou des ligatures. Par exemple, ReplaceFirst("oef", "œ", "i")renvoie incorrectement "ief" au lieu de "if". Voir cette question pour plus d'informations.
Michael Liu
2
ReSharper prévient String.IndexOf is culture specific.. Plus robuste à mettre à jour int pos = text.IndexOf(search, StringComparison.Ordinal);.
Contango
64
Comme itsmatt l'a dit Regex.Replace est un bon choix pour cela, mais pour rendre sa réponse plus complète, je vais la compléter avec un exemple de code:
using System.Text.RegularExpressions;...Regex regex =newRegex("foo");string result = regex.Replace("foo1 foo2 foo3 foo4","bar",1);// result = "bar1 foo2 foo3 foo4"
Le troisième paramètre, défini sur 1 dans ce cas, est le nombre d'occurrences du modèle regex que vous souhaitez remplacer dans la chaîne d'entrée à partir du début de la chaîne.
J'espérais que cela pourrait être fait avec une surcharge statique Regex.Replace mais malheureusement, il semble que vous ayez besoin d'une instance Regex pour l'accomplir.
Une des surcharges de Regex.Replaceprend un intpour "Le nombre maximum de fois que le remplacement peut se produire". Évidemment, utiliser Regex.Replacepour le remplacement de texte brut peut sembler exagéré, mais c'est certainement concis:
Réponses:
Exemple:
EDIT : Comme @itsmatt l'a mentionné , il y a aussi Regex.Replace (String, String, Int32), qui peut faire la même chose, mais est probablement plus cher à l'exécution, car il utilise un analyseur complet où ma méthode fait une recherche et trois chaînes concaténations.
EDIT2 : S'il s'agit d'une tâche courante, vous souhaiterez peut-être faire de la méthode une méthode d'extension:
En utilisant l'exemple ci-dessus, il est maintenant possible d'écrire:
la source
ReplaceFirst("oef", "œ", "i")
renvoie incorrectement "ief" au lieu de "if". Voir cette question pour plus d'informations.String.IndexOf is culture specific.
. Plus robuste à mettre à jourint pos = text.IndexOf(search, StringComparison.Ordinal);
.Comme itsmatt l'a dit Regex.Replace est un bon choix pour cela, mais pour rendre sa réponse plus complète, je vais la compléter avec un exemple de code:
Le troisième paramètre, défini sur 1 dans ce cas, est le nombre d'occurrences du modèle regex que vous souhaitez remplacer dans la chaîne d'entrée à partir du début de la chaîne.
J'espérais que cela pourrait être fait avec une surcharge statique Regex.Replace mais malheureusement, il semble que vous ayez besoin d'une instance Regex pour l'accomplir.
la source
"foo"
, mais vous allez vouloir unnew Regex(Regex.Escape("foo"))
pour le figuratif"foo"
.Jetez un œil à Regex.Replace .
la source
En tenant compte du «premier seulement», peut-être:
?
Ou plus généralement:
Ensuite:
la source
trouvera le premier
F
dansInputString
et le remplacera parR
.la source
result = (New Regex("F")).Replace(InputString, "R", 1)
Méthode d'extension C # qui fera ceci:
Prendre plaisir
la source
Dans la syntaxe C #:
la source
Et comme il y a aussi VB.NET à considérer, je voudrais offrir:
la source
Suppose qu'il
AA
ne doit être remplacé que s'il se trouve au tout début de la chaîne:Si vous devez remplacer la première occurrence de
AA
, que la chaîne commence par elle ou non, optez pour la solution de Marc.la source
Une des surcharges de
Regex.Replace
prend unint
pour "Le nombre maximum de fois que le remplacement peut se produire". Évidemment, utiliserRegex.Replace
pour le remplacement de texte brut peut sembler exagéré, mais c'est certainement concis:la source
Pour tous ceux qui ne se soucient pas d'une référence
Microsoft.VisualBasic
, il y a laReplace
méthode :la source
Cet exemple résume les sous-chaînes (mais est plus lent), mais est probablement beaucoup plus rapide qu'un RegEx:
la source
Mise à jour de la méthode d'extension permettant
Span
de minimiser la création de nouvelles chaînesla source
la source