117 votes

Comment remplacer la *première instance* d'une chaîne de caractères en .NET ?

Je veux remplacer la première occurrence dans une chaîne donnée.

Comment puis-je réaliser cela en .NET ?

0 votes

Veuillez rédiger des messages clairs et compréhensibles. J'ai également édité celui-ci pour vous. Vous auriez dû spécifier une langue au moins ici.

0 votes

Bien sûr, ce n'est jamais remplacés ... il s'agit toujours d'une nouvelle chaîne contenant l'original avec le texte remplacé. C'est parce que les chaînes de caractères sont immuables.

0 votes

J'ai essayé la méthode ` String.Replace()`, mais elle remplace tous les "AA" par des "XQ".

147voto

VVS Points 11528
string ReplaceFirst(string text, string search, string replace)
{
  int pos = text.IndexOf(search);
  if (pos < 0)
  {
    return text;
  }
  return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
}

Exemple :

string str = "The brown brown fox jumps over the lazy dog";

str = ReplaceFirst(str, "brown", "quick");

EDIT : Comme @itsmatt mentionné Il y a aussi Regex.Replace(String, String, Int32), qui peut faire la même chose, mais qui est probablement plus coûteux à l'exécution, puisqu'il utilise un analyseur complet alors que ma méthode ne fait qu'une recherche et trois concaténations de chaînes.

EDIT2 : S'il s'agit d'une tâche courante, vous pouvez faire de cette méthode une méthode d'extension :

public static class StringExtension
{
  public static string ReplaceFirst(this string text, string search, string replace)
  {
     // ...same as above...
  }
}

En utilisant l'exemple ci-dessus, il est maintenant possible d'écrire :

str = str.ReplaceFirst("brown", "quick");

4 votes

Attention : Cela ne fonctionne pas correctement avec les caractères combinés Unicode ou les ligatures. Par exemple, ReplaceFirst("oef", "œ", "i") renvoie incorrectement "ief" au lieu de "if". Voir aussi cette question pour plus d'informations.

69voto

Wes Haggard Points 2370

Comme itsmatt a déclaré Regex.Remplacer est un bon choix pour cela ; cependant, pour rendre sa réponse plus complète, je vais la compléter avec un exemple de code :

using System.Text.RegularExpressions;
...
Regex regex = new Regex("foo");
string result = regex.Replace("foo1 foo2 foo3 foo4", "bar", 1);             
// result = "bar1 foo2 foo3 foo4"

Le troisième paramètre, défini à 1 dans ce cas, est le nombre d'occurrences du motif regex que vous voulez 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 un système statique. Regex.Remplacer mais malheureusement, il semble que vous ayez besoin d'une instance Regex pour le faire.

1 votes

Cela fonctionne pour le littéral "foo" mais vous aurez besoin d'un new Regex(Regex.Escape("foo")) pour le figuratif "foo" .

16voto

itsmatt Points 18905

Jetez un coup d'œil à Regex.Remplacer .

2 votes

Plus précisément, la méthode Regex.Replace (String, String, Int32) fait l'affaire et est très concise.

16voto

Deenesh Points 11
using System.Text.RegularExpressions;

RegEx MyRegEx = new RegEx("F");
string result = MyRegex.Replace(InputString, "R", 1);

trouvera d'abord F en InputString et le remplacer par R .

2 votes

Je l'ai simplifié en une phrase result = (New Regex("F")).Replace(InputString, "R", 1)

0 votes

Meilleure réponse ici (en conjonction avec cjbarth)

1 votes

La syntaxe peut ne pas être RegEx mais Regex selon la version.

15voto

Marc Gravell Points 482669

En tenant compte de la "première seulement", peut-être :

int index = input.IndexOf("AA");
if (index >= 0) output = input.Substring(0, index) + "XQ" +
     input.Substring(index + 2);

?

Ou plus généralement :

public static string ReplaceFirstInstance(this string source,
    string find, string replace)
{
    int index = source.IndexOf(find);
    return index < 0 ? source : source.Substring(0, index) + replace +
         source.Substring(index + find.Length);
}

Entonces:

string output = input.ReplaceFirstInstance("AA", "XQ");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X