2010-06-23 2 views
2

j'utilisais la fonction TrimStart pour effectuer les opérations suivantes:Y at-il une fonction .NET pour supprimer la première occurrence (et seulement la première) au début d'une chaîne?

var example = "Savings:Save 20% on this stuff"; 
example = example.TrimStart("Savings:".ToCharArray()); 

Je me attendais à cela le résultat de l'exemple ayant une valeur de « Economisez 20% sur ce genre de choses ».

Cependant, ce que j'ai obtenu était "e 20% sur ce genre de choses".

Après avoir lu la documentation sur TrimStart, je comprends pourquoi, mais maintenant je me demande s'il existe une fonction dans .NET qui fait ce que j'essayais de faire en premier lieu?

Est-ce que quelqu'un connaît une fonction, donc je n'ai pas besoin de créer la mienne et de la suivre?

Répondre

10

Je ne pense pas qu'une telle méthode existe, mais vous pouvez facilement le faire en utilisant StartsWith et Substring:

s = s.StartsWith(toRemove) ? s.Substring(toRemove.Length) : s; 

Vous pouvez même l'ajouter comme une méthode d'extension:

public static class StringExtension 
{ 
    public static string RemoveFromStart(this string s, string toRemove) 
    { 
     if (s == null) 
     { 
      throw new ArgumentNullException("s"); 
     } 

     if (toRemove == null) 
     { 
      throw new ArgumentNullException("toRemove"); 
     } 

     if (!s.StartsWith(toRemove)) 
     { 
      return s; 
     } 

     return s.Substring(toRemove.Length); 
    } 
} 
+0

grâce à l'extension. J'essayais d'éviter d'écrire mon propre code pour le faire, mais je suppose que c'est inévitable. – Joseph

+1

J'irais personnellement avec un conditionnel ici: 'return s.StartsWith (toRemove)? s.Substring (toRemove.Length): s; 'Mais je sais pas tout le monde est un fan de l'opérateur conditionnel :) –

+0

C'est certainement le chemin à parcourir, clair et facile à vérifier l'exactitude. Voici une alternative horriblement mauvaise que j'ai vu dans le code de production (modifié pour correspondre à l'exemple): 'example.Split (new [] {" Savings: "}, 2, StringSplitOptions.RemoveEmptyEntries) [0]'. Je ne sais pas ce que l'auteur original pensait ... – LBushkin

2

Non, Je ne crois pas qu'il y ait quelque chose qui fasse cela dans le cadre. C'est une exigence quelque peu inhabituelle, IMO.

Notez que vous devez réfléchir soigneusement si vous essayez de supprimer "la première occurrence" ou de supprimer l'occurrence au début de la chaîne, s'il y en a une. Par exemple, pensez à ce que vous voudriez faire avec: "Bonjour Économies: Économisez 20% sur ce genre de choses".

+0

Bon point .. Mon intention était seulement au début de la chaîne, pas réellement la première occurrence. Mais encore une fois, seulement la première fois, pas à plusieurs reprises. – Joseph

+0

@Joseph: Dans ce cas, la réponse de Mark devrait vous suffire. Je vais laisser celui-ci ici pour le rendre clair. –

2

Vous pouvez le faire assez facilement en utilisant une expression régulière.

Retirez l'occurrence le début de la chaîne:

example = Regex.Replace(example, @"^Savings:", ""); 

Retirez la première occurrence de la chaîne:

example = Regex.Replace(example, @"(?<!Savings:.*)Savings:", ""); 
+0

Cela ne me semble pas aussi simple que d'avoir une seule méthode supplémentaire (simple). En particulier, il devient poilu dès que vous avez besoin de commencer à supprimer quelque chose qui a une signification particulière dans les expressions régulières. –

+0

@Jon, pas du tout, construire la chaîne en utilisant 'Regex.Escape()' sur le texte pour correspondre et vous êtes bon. – Lucero

+0

Oui, mais vous devez vous rappeler de le faire ... ce que je soupçonne que beaucoup de gens ne le feraient pas. Je pense que la solution de Mark est beaucoup plus simple. Plus de lignes de code, mais plus difficile de se tromper. –

Questions connexes