Puede usar expresiones regulares para este propósito, pero es bueno evitar excepciones adicionales cuando la cadena de entrada no coincide con la expresión regular.
Primero para evitar el dolor de cabeza adicional de escapar al patrón regex: podríamos usar la función para ese propósito:
String reStrEnding = Regex.Escape("-");
Sé que esto no hace nada, ya que "-" es lo mismo que Regex.Escape("=") == "=", pero hará la diferencia, por ejemplo, si el personaje lo es @"\".
Luego, debemos hacer coincidir desde el inicio de la secuencia hasta el final de la secuencia, o alternativamente, si no se encuentra el final, no coincida con nada. (Cuerda vacía)
Regex re = new Regex("^(.*?)" + reStrEnding);
Si su aplicación es crítica para el rendimiento, entonces separe la línea para el nuevo Regex, si no, puede tener todo en una línea.
Y, finalmente, hacer coincidir con la cadena y extraer el patrón coincidente:
String matched = re.Match(str).Groups[1].ToString();
Y después de eso, puede escribir una función separada, como se hizo en otra respuesta, o escribir una función lambda en línea. Escribí ahora usando ambas notaciones: función lambda en línea (no permite el parámetro predeterminado) o llamada de función separada.
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());
}
}
Por cierto, cambiar el patrón de expresión regular para "^(.*?)(-|$)"permitir recoger hasta el "-"patrón o si no se encontró el patrón, recoger todo hasta el final de la cadena.