130 votes

C# - Méthode la plus simple pour supprimer la première occurrence d'une sous-chaîne d'une autre chaîne de caractères

J'ai besoin de supprimer la première (et SEULEMENT la première) occurrence d'une chaîne de caractères d'une autre chaîne de caractères.

Voici un exemple de remplacement de la chaîne de caractères "\\Iteration" . Ceci :

ProjectName\\\\Iteration\\\\Release1\\\\Iteration1

deviendrait ceci :

ProjectName\\\\Release1\\\\Iteration1

Voici un code qui permet de réaliser cette opération :

const string removeString = "\\Iteration";
int index = sourceString.IndexOf(removeString);
int length = removeString.Length;
String startOfString = sourceString.Substring(0, index);
String endOfString = sourceString.Substring(index + length);
String cleanPath = startOfString + endOfString;

Cela semble être beaucoup de code.

Ma question est donc la suivante : Existe-t-il une façon plus propre, plus lisible et plus concise de procéder ?

189voto

LukeH Points 110965
int index = sourceString.IndexOf(removeString);
string cleanPath = (index < 0)
    ? sourceString
    : sourceString.Remove(index, removeString.Length);

44voto

malcolm waldron Points 521
sourceString.Replace(removeString, "");

33voto

Joel Etherton Points 24155
string myString = sourceString.Remove(sourceString.IndexOf(removeString),removeString.Length);

EDIT : @OregonGhost a raison. J'aurais moi-même décomposé le script avec des conditionnelles pour vérifier une telle occurrence, mais je partais du principe que les chaînes de caractères devaient s'appartenir l'une à l'autre pour une raison ou une autre. Il est possible que les règles de gestion des exceptions imposées par les entreprises soient censées tenir compte de cette possibilité. Pour ma part, j'utiliserais quelques lignes supplémentaires pour effectuer des vérifications conditionnelles et pour rendre le texte un peu plus lisible pour les développeurs débutants qui ne prennent peut-être pas le temps de le lire en détail.

13voto

CaffGeek Points 10925

Écriture d'un test TDD rapide pour ceci

    [TestMethod]
    public void Test()
    {
        var input = @"ProjectName\Iteration\Release1\Iteration1";
        var pattern = @"\\Iteration";

        var rgx = new Regex(pattern);
        var result = rgx.Replace(input, "", 1);

        Assert.IsTrue(result.Equals(@"ProjectName\Release1\Iteration1"));
    }

rgx.Replace(input, "", 1); dit de rechercher dans l'entrée tout ce qui correspond au motif, avec "", 1 fois.

8voto

Michael Valenty Points 5482

Vous pouvez utiliser un méthode d'extension pour le plaisir. En général, je ne recommande pas d'attacher des méthodes d'extension à une classe aussi générale que string, mais comme je l'ai dit, c'est amusant. J'ai emprunté la réponse de @Luke car il ne sert à rien de réinventer la roue.

[Test]
public void Should_remove_first_occurrance_of_string() {

    var source = "ProjectName\\Iteration\\Release1\\Iteration1";

    Assert.That(
        source.RemoveFirst("\\Iteration"),
        Is.EqualTo("ProjectName\\Release1\\Iteration1"));
}

public static class StringExtensions {
    public static string RemoveFirst(this string source, string remove) {
        int index = source.IndexOf(remove);
        return (index < 0)
            ? source
            : source.Remove(index, remove.Length);
    }
}

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