Vous pouvez utiliser des expressions régulières à cette fin, mais il est bon d'éviter des exceptions supplémentaires lorsque la chaîne d'entrée ne correspond pas à l'expression régulière.
Tout d'abord, pour éviter un mal de tête supplémentaire de s'échapper vers le modèle regex - nous pourrions simplement utiliser la fonction à cette fin:
String reStrEnding = Regex.Escape("-");
Je sais que cela ne fait rien - car "-" est la même chose que Regex.Escape("=") == "=", mais cela fera une différence par exemple si le caractère est @"\".
Ensuite, nous devons faire correspondre le début de la chaîne à la fin de la chaîne, ou alternativement si la fin n'est pas trouvée - alors rien ne correspond. (Chaîne vide)
Regex re = new Regex("^(.*?)" + reStrEnding);
Si votre application est critique en termes de performances - alors une ligne distincte pour le nouveau Regex, sinon - vous pouvez tout avoir sur une seule ligne.
Et enfin correspondre à la chaîne et extraire le modèle correspondant:
String matched = re.Match(str).Groups[1].ToString();
Et après cela, vous pouvez soit écrire une fonction séparée, comme cela a été fait dans une autre réponse, soit écrire une fonction lambda en ligne. J'ai écrit maintenant en utilisant les deux notations - fonction lambda en ligne (n'autorise pas le paramètre par défaut) ou appel de fonction séparé.
using System;
using System.Text.RegularExpressions;
static class Helper
{
public static string GetUntilOrEmpty(this string text, string stopAt = "-")
{
return new Regex("^(.*?)" + Regex.Escape(stopAt)).Match(text).Groups[1].Value;
}
}
class Program
{
static void Main(string[] args)
{
Regex re = new Regex("^(.*?)-");
Func<String, String> untilSlash = (s) => { return re.Match(s).Groups[1].ToString(); };
Console.WriteLine(untilSlash("223232-1.jpg"));
Console.WriteLine(untilSlash("443-2.jpg"));
Console.WriteLine(untilSlash("34443553-5.jpg"));
Console.WriteLine(untilSlash("noEnding(will result in empty string)"));
Console.WriteLine(untilSlash(""));
// Throws exception: Console.WriteLine(untilSlash(null));
Console.WriteLine("443-2.jpg".GetUntilOrEmpty());
}
}
Btw - changer le modèle de regex en "^(.*?)(-|$)"permettra de ramasser soit jusqu'au "-"modèle ou si le modèle n'a pas été trouvé - ramasser tout jusqu'à la fin de la chaîne.