100 votes

Remplacer la dernière occurrence d'un mot dans une chaîne de caractères - C#

J'ai un problème où je dois remplacer la dernière occurrence d'un mot dans une chaîne de caractères.

Situation : On me donne une chaîne de caractères qui a ce format :

string filePath ="F:/jan11/MFrame/Templates/feb11";

Je remplace alors TnaName comme ça :

filePath = filePath.Replace(TnaName, ""); // feb11 is TnaName

Cela fonctionne, mais j'ai un problème lorsque TnaName est le même que mon folder name . Lorsque cela se produit, je finis par obtenir une chaîne de caractères comme celle-ci :

F:/feb11/MFrame/Templates/feb11

Il a maintenant remplacé les deux occurrences de TnaName con feb11 . Existe-t-il un moyen de remplacer uniquement la dernière occurrence du mot dans ma chaîne ?

Note : feb11 es TnaName qui provient d'un autre processus - ce n'est pas un problème.

210voto

Behroz Sikander Points 2557

Voici la fonction permettant de remplacer la dernière occurrence d'une chaîne de caractères

public static string ReplaceLastOccurrence(string Source, string Find, string Replace)
{
        int place = Source.LastIndexOf(Find);

        if(place == -1)
           return Source;

        string result = Source.Remove(place, Find.Length).Insert(place, Replace);
        return result;
}
  • Source est la chaîne de caractères sur laquelle vous voulez effectuer l'opération.
  • Find est la chaîne de caractères que vous voulez remplacer.
  • Replace est la chaîne de caractères que vous voulez remplacer.

12voto

Montycarlo Points 725

Utilice string.LastIndexOf() pour trouver l'index de la dernière occurrence de la chaîne et ensuite utiliser substring pour chercher votre solution.

8voto

MD.Unicorn Points 8354

Vous devez effectuer le remplacement manuellement :

int i = filePath.LastIndexOf(TnaName);
if (i >= 0)
    filePath = filePath.Substring(0, i) + filePath.Substring(i + TnaName.Length);

4voto

toddmo Points 510

Je ne vois pas pourquoi on ne peut pas utiliser Regex :

public static string RegexReplace(this string source, string pattern, string replacement)
{
  return Regex.Replace(source,pattern, replacement);
}

public static string ReplaceEnd(this string source, string value, string replacement)
{
  return RegexReplace(source, $"{value}$", replacement);
}

public static string RemoveEnd(this string source, string value)
{
  return ReplaceEnd(source, value, string.Empty);
}

Utilisation :

string filePath ="F:/feb11/MFrame/Templates/feb11";
filePath = filePath.RemoveEnd("feb11"); // F:/feb11/MFrame/Templates/
filePath = filePath.ReplaceEnd("feb11","jan11"); // F:/feb11/MFrame/Templates/jan11

2voto

MarcBalta Points 91

La solution peut être mise en œuvre encore plus simplement avec une seule ligne :

 static string ReplaceLastOccurrence(string str, string toReplace, string replacement)
    {
        return Regex.Replace(str, $@"^(.*){Regex.Escape(toReplace)}(.*?)$", $"$1{Regex.Escape(replacement)}$2");
    }

Nous profitons ici de l'avidité de l'opérateur astérisque des regex. La fonction est utilisée comme suit :

var s = "F:/feb11/MFrame/Templates/feb11";
var tnaName = "feb11";
var r = ReplaceLastOccurrence(s,tnaName, string.Empty);

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