web-dev-qa-db-fra.com

Comment remplacer la * première instance * d'une chaîne dans .NET?

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

Comment puis-je accomplir cela dans .NET?

101
Nirmal
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");

[~ # ~] modifier [~ # ~] : comme @itsmatt mentionné , il y a aussi Regex.Replace (String, String, Int32), qui peut faire de même, mais est probablement plus cher à l'exécution, car il utilise un analyseur complet où ma méthode fait une recherche et trois concaténations de chaînes.

EDIT2 : S'il s'agit d'une tâche courante, vous souhaiterez peut-être faire de la 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");
125
VVS

Comme itsmatt l'a dit Regex.Replace est un bon choix pour cela, mais pour rendre sa réponse plus complète, je le remplirai 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 sur 1 dans ce cas, est le nombre d'occurrences du modèle d'expression régulière que vous souhaitez remplacer dans la chaîne d'entrée depuis le 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.

60
Wes Haggard

Jetez un oeil à Regex.Replace .

16
itsmatt

En tenant compte du "premier 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);
}

Ensuite:

string output = input.ReplaceFirstInstance("AA", "XQ");
15
Marc Gravell
using System.Text.RegularExpressions;

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

trouvera d'abord F dans InputString et le remplacera par R.

10
Deenesh

En syntaxe C #:

int loc = original.IndexOf(oldValue);
if( loc < 0 ) {
    return original;
}
return original.Remove(loc, oldValue.Length).Insert(loc, newValue);
8
Bill the Lizard

Méthode d'extension C # qui fera cela:

public static class StringExt
{
    public static string ReplaceFirstOccurrence(this string s, string oldValue, string newValue)
    {
         int i = s.IndexOf(oldValue);
         return s.Remove(i, oldValue.Length).Insert(i, newValue);    
    } 
}

Prendre plaisir

8
mortenbpost

Suppose que AA ne doit être remplacé que s'il se trouve au tout début de la chaîne:

var newString;
if(myString.StartsWith("AA"))
{
  newString ="XQ" + myString.Substring(2);
}

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.

4
Oded

Et parce qu'il y a aussi VB.NET à considérer, je voudrais offrir:

Private Function ReplaceFirst(ByVal text As String, ByVal search As String, ByVal replace As String) As String
    Dim pos As Integer = text.IndexOf(search)
    If pos >= 0 Then
        Return text.Substring(0, pos) + replace + text.Substring(pos + search.Length)
    End If
    Return text 
End Function
4
Anthony Potts

L'une des surcharges de Regex.Replace prend un int pour "Le nombre maximal de fois que le remplacement peut se produire". De toute évidence, en utilisant Regex.Replace pour le remplacement de texte brut peut sembler exagéré, mais il est certainement concis:

string output = (new Regex("AA")).Replace(input, "XQ", 1);
3
AakashM

Pour tous ceux qui ne se soucient pas d'une référence à Microsoft.VisualBasic, il y a la Replace méthode :

string result = Microsoft.VisualBasic.Strings.Replace("111", "1", "0", 2, 1); // "101"
2
Slai

Regex.Replace , en particulier RegEx.Replace (string, string, int), est probablement ce que vous recherchez. Cela ou String.IndexOf qui vous donnera l'index et vous pourrez ensuite couper et reconstruire la chaîne avec le nouveau texte que vous souhaitez.

Un exemple démontrant ce dernier (comme d'abord démontré par @ David Humpohl ):

string str = "Hello WorldWorld";

str = ReplaceFirst(str, "World", "StackOverflow ");

...

string ReplaceFirst(string text, string search, string replace)
{
    int pos = text.IndexOf(search);
    if (pos >= 0)
    {
        return text.Substring(0, pos) + replace + text.Substring(pos + search.Length);
    }
    return text;
}
1
Orion Adrian

Cet exemple résume les sous-chaînes (mais est plus lent), mais est probablement beaucoup plus rapide qu'un RegEx:

var parts = contents.ToString().Split(new string[] { "needle" }, 2, StringSplitOptions.None);
return parts[0] + "replacement" + parts[1];
1
user3638471