Bạn có thể sử dụng biểu thức chính quy cho mục đích này, nhưng bạn nên tránh thêm ngoại lệ khi chuỗi nhập không khớp với biểu thức chính quy.
Đầu tiên để tránh phải đau đầu thêm khi thoát đến mẫu regex - chúng ta chỉ có thể sử dụng hàm cho mục đích đó:
String reStrEnding = Regex.Escape("-");
Tôi biết rằng điều này không làm bất cứ điều gì - như "-" giống như Regex.Escape("=") == "="
, nhưng nó sẽ tạo ra sự khác biệt, ví dụ nếu ký tự là @"\"
.
Sau đó, chúng ta cần so khớp từ cầu xin của chuỗi thành kết thúc chuỗi hoặc thay thế nếu không tìm thấy kết thúc - sau đó không khớp với nhau. (Chuỗi trống)
Regex re = new Regex("^(.*?)" + reStrEnding);
Nếu ứng dụng của bạn là quan trọng về hiệu suất - thì hãy tách dòng cho Regex mới, nếu không - bạn có thể có mọi thứ trong một dòng.
Và cuối cùng đối sánh với chuỗi và trích xuất mẫu phù hợp:
String matched = re.Match(str).Groups[1].ToString();
Và sau đó, bạn có thể viết một hàm riêng biệt, giống như nó đã được thực hiện trong một câu trả lời khác, hoặc viết hàm lambda nội tuyến. Tôi đã viết bây giờ bằng cách sử dụng cả hai ký hiệu - hàm lambda nội tuyến (không cho phép tham số mặc định) hoặc lệnh gọi hàm riêng biệt.
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 - thay đổi mẫu regex thành "^(.*?)(-|$)"
sẽ cho phép chọn hoặc cho đến khi "-"
mẫu hoặc nếu không tìm thấy mẫu - chọn mọi thứ cho đến khi kết thúc chuỗi.