2010-01-07 28 views
69

String.Split thuận tiện cho việc tách một chuỗi với nhiều phần trên dấu phân cách.String.Split chỉ trên dấu phân cách đầu tiên trong C#?

Làm cách nào để tôi chỉ tách chuỗi trên dấu tách đầu tiên. Ví dụ. Tôi đã một chuỗi

"Time: 10:12:12\r\n" 

Và tôi muốn một mảng trông như

{"Time","10:12:12\r\n"} 
+0

chia nhỏ bằng cách sử dụng khoảng trắng? và đặt arry = yourString.Split (''); –

+1

@RamgyBorja sẽ không hoạt động trừ khi anh ta cũng trims ':' từ 'Time' và dù sao, không phải cái được hỏi – smurtagh

+0

@smurtagh yes, cho mã an toàn được sử dụng trim –

Trả lời

128

Cách tiếp cận tốt nhất tùy thuộc vào mức độ linh hoạt mà bạn muốn phân tích cú pháp, đối với các khoảng trống thừa có thể có và như vậy. Kiểm tra các thông số kỹ thuật định dạng chính xác để xem những gì bạn cần.

yourString.Split(new char[] { ':' }, 2) 

Sẽ giới hạn hai hai chất nền. Tuy nhiên, điều này không cắt không gian ở đầu chuỗi thứ hai. Bạn có thể làm điều đó trong một hoạt động thứ hai sau khi chia tách tuy nhiên.

yourString.Split(new char[] { ':', ' ' }, 2, 
    StringSplitOptions.RemoveEmptyEntries) 

Nên làm việc, nhưng sẽ bị hỏng nếu bạn đang cố gắng phân tách tên tiêu đề chứa khoảng trắng.

yourString.Split(new string[] { ": " }, 2, 
    StringSplitOptions.None); 

Sẽ làm chính xác những gì bạn mô tả, nhưng thực sự yêu cầu không gian để có mặt.

yourString.Split(new string[] { ": ", ":" }, 2, 
    StringSplitOptions.None); 

Làm cho không gian tùy chọn, nhưng bạn vẫn phải TrimStart() trong trường hợp có nhiều không gian.

Để giữ định dạng hơi linh hoạt, và mã của bạn có thể đọc được, tôi khuyên bạn nên sử dụng tùy chọn đầu tiên:

string[] split = yourString.Split(new char[] { ':' }, 2); 
// Optionally check split.Length here 
split[1] = split[1].TrimStart(); 
+0

Tại sao không sử dụng (String [], Int32, StringSplitOptions) quá tải? (http://msdn.microsoft.com/en-us/library/1bwe3zdy.aspx). Điều này chỉ áp dụng cho .NET 2.0 trở lên, nhưng sau đây cho kết quả chính xác mà OP đã yêu cầu: yourString.Tách (chuỗi mới [] {":"}, 2, StringSplitOptions.None) – bernhof

+0

@Bernhof: có. Tôi không chắc chắn những gì sẽ xảy ra trong trường hợp không gian thêm (hoặc không có không gian) trong chuỗi Tuy nhiên. Cách tiếp cận tốt nhất khác một chút tùy thuộc vào hành vi mong muốn. – Thorarin

+2

Tôi thấy nó rất khó hiểu rằng một cái gì đó như yourString.Split (':', 2); không hoạt động ... Cảm ơn bạn đã giải thích! – Sebastian

12

Trong ví dụ của bạn ở trên, bạn có thể chia trên ":" (tức là ruột với dấu không gian) vì điều này dường như là những gì bạn đã làm. Nếu bạn thực sự đã tách ra chỉ là dấu phân cách đầu tiên bạn sẽ thấy một không gian hàng đầu trong phần tử mảng thứ hai của bạn.

Tuy nhiên, có lẽ bạn nên nhìn vào tình trạng quá tải này của Split ...

http://msdn.microsoft.com/en-us/library/c1bs0eda.aspx

public string[] Split(
    char[] separator, 
    int count 
) 

... cho phép bạn chỉ định một số tối đa của chuỗi con.

3
?("Time: 10:12:12\r\n").Split(new char[] { ':', ' ' }, 2, 
    StringSplitOptions.RemoveEmptyEntries) 
{Dimensions:[2]} 
    [0]: "Time" 
    [1]: "10:12:12\r\n" 

lựa chọn khác:

?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 2) 
{Dimensions:[2]} 
    [0]: "Time" 
    [1]: " 10:12:12\r\n" 
?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 1) 
{Dimensions:[1]} 
    [0]: "Time: 10:12:12\r\n" 
?("Time: 10:12:12\r\n").Split(new char[] { ':' }, 3) 
{Dimensions:[3]} 
    [0]: "Time" 
    [1]: " 10" 
    [2]: "12:12\r\n" 
+0

Dấu phân cách là dấu hai chấm, không phải dấu cách. Bạn nói đúng rằng việc chia tách trên không gian sẽ ổn và đưa ra 2 yếu tố, nhưng tôi không nghĩ đó là câu hỏi được hỏi. –

+0

yah, quan sát, cố định – serhio

+0

Thực ra, nó trả về mảng 4 phần tử ở đây ... – Thorarin

1

Tôi đã thông qua một sự thay đổi để Câu trả lời của Thorarin ở trên, Dưới đây sẽ có thể xử lý yêu cầu của bạn, cộng với cắt không gian.

yourString.Split(new []{'-'},2).Select(s => s.Trim()) 
Các vấn đề liên quan