Для этой цели можно использовать регулярные выражения, но рекомендуется избегать дополнительных исключений, когда входная строка не соответствует регулярному выражению.
Во-первых, чтобы избежать лишней головной боли при переходе к шаблону регулярного выражения - мы могли бы просто использовать для этой цели функцию:
String reStrEnding = Regex.Escape("-");
Я знаю, что это ничего не делает - поскольку "-" то же самое, что и Regex.Escape("=") == "=", но это будет иметь значение, например, если символ @"\".
Затем нам нужно сопоставить начало строки с окончанием строки или, альтернативно, если окончание не найдено - тогда ничего не сопоставить. (Пустая строка)
Regex re = new Regex("^(.*?)" + reStrEnding);
Если ваше приложение критично к производительности - тогда отдельную строку для нового Regex, если нет - вы можете все в одной строке.
И, наконец, сопоставьте строку и извлеките соответствующий шаблон:
String matched = re.Match(str).Groups[1].ToString();
И после этого вы можете написать отдельную функцию, как это было сделано в другом ответе, или написать встроенную лямбда-функцию. Я написал сейчас, используя обе нотации - встроенную лямбда-функцию (не разрешает параметр по умолчанию) или отдельный вызов функции.
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 - изменение шаблона регулярного выражения на "^(.*?)(-|$)"позволит подобрать либо до "-"шаблона, либо, если шаблон не был найден - забрать все до конца строки.