È possibile utilizzare espressioni regolari per questo scopo, ma è bene evitare eccezioni aggiuntive quando la stringa di input non corrisponde all'espressione regolare.
Prima di tutto per evitare un ulteriore mal di testa di sfuggire al pattern regex - potremmo semplicemente usare la funzione per quello scopo:
String reStrEnding = Regex.Escape("-");
So che questo non fa nulla - poiché "-" è uguale a Regex.Escape("=") == "=", ma farà la differenza, ad esempio, se il carattere lo è @"\".
Quindi dobbiamo abbinare dall'accattonaggio della stringa alla fine della stringa, o in alternativa, se la fine non viene trovata, non corrispondere a nulla. (Stringa vuota)
Regex re = new Regex("^(.*?)" + reStrEnding);
Se la tua applicazione è critica per le prestazioni, quindi una riga separata per il nuovo Regex, in caso contrario, puoi avere tutto in una riga.
Infine, confronta la stringa ed estrai il modello corrispondente:
String matched = re.Match(str).Groups[1].ToString();
Dopodiché puoi scrivere una funzione separata, come è stato fatto in un'altra risposta, oppure scrivere una funzione lambda inline. Ho scritto ora usando entrambe le notazioni: funzione lambda inline (non consente il parametro predefinito) o chiamata di funzione separata.
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 - cambiare il pattern regex in "^(.*?)(-|$)"consentirà di riprendere fino al "-"pattern o se il pattern non è stato trovato - raccogliere tutto fino alla fine della stringa.