W tym celu możesz użyć wyrażeń regularnych, ale dobrze jest unikać dodatkowych wyjątków, gdy ciąg wejściowy jest niezgodny z wyrażeniem regularnym.
Po pierwsze, aby uniknąć dodatkowego bólu głowy związanego z ucieczką do wzorca regex - możemy po prostu użyć funkcji do tego celu:
String reStrEnding = Regex.Escape("-");
Wiem, że to nic nie robi - ponieważ "-" jest tym samym co Regex.Escape("=") == "=", ale będzie miało znaczenie, na przykład, jeśli znak jest@"\" .
Następnie musimy dopasować od początku ciągu do końca łańcucha lub na przemian, jeśli koniec nie zostanie znaleziony - wtedy nic nie dopasowujemy. (Pusta struna)
Regex re = new Regex("^(.*?)" + reStrEnding);
Jeśli Twoja aplikacja ma krytyczne znaczenie dla wydajności - to oddzielna linia dla nowego Regex, jeśli nie - możesz mieć wszystko w jednej linii.
I na koniec dopasuj do ciągu i wyodrębnij dopasowany wzorzec:
String matched = re.Match(str).Groups[1].ToString();
Następnie możesz albo napisać oddzielną funkcję, tak jak to było zrobione w innej odpowiedzi, lub napisać wbudowaną funkcję lambda. Napisałem teraz używając obu notacji - wbudowanej funkcji lambda (nie pozwala na domyślny parametr) lub oddzielnego wywołania funkcji.
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 - zmiana wzorca wyrażenia regularnego na "^(.*?)(-|$)"pozwoli podnieść albo do "-"wzorca, albo jeśli wzorzec nie został znaleziony - podnieś wszystko do końca łańcucha.