คุณสามารถใช้นิพจน์ทั่วไปเพื่อจุดประสงค์นี้ แต่ควรหลีกเลี่ยงข้อยกเว้นพิเศษเมื่อสตริงอินพุตไม่ตรงกันกับนิพจน์ทั่วไป
ก่อนอื่นเพื่อหลีกเลี่ยงอาการปวดหัวเป็นพิเศษในการหลีกเลี่ยงรูปแบบ regex - เราสามารถใช้ฟังก์ชันเพื่อจุดประสงค์นั้น:
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 - การเปลี่ยนรูปแบบ regex เพื่อ"^(.*?)(-|$)"จะอนุญาตให้หยิบขึ้นมาได้จนกว่า"-"รูปแบบหรือหากไม่พบรูปแบบ - เลือกทุกอย่างจนจบสตริง