Tách một chuỗi bằng một chuỗi khác trong C #


681

Tôi đã sử dụng Split()phương pháp để phân tách các chuỗi, nhưng điều này chỉ xuất hiện để hoạt động nếu bạn đang tách một chuỗi theo một ký tự. Có cách nào để tách a string, với một chuỗi khác là chia theo tham số không?

Tôi đã thử chuyển đổi bộ chia thành một mảng ký tự, không có may mắn.

Nói cách khác, tôi muốn chia nhỏ string:

THExxQUICKxxBROWNxxFOX

bởi xxvà trả về một mảng có giá trị:

CHÚ CÁO NÂU NHANH NHẸN


2
Đối với mối quan tâm tương lai: Một trong những quan tâm bên dưới nhận xét tôi vì vậy tôi quyết định mở một cuộc thảo luận về công nghệ phần mềm liên quan đến trực giấc cách (nhưng phải) để làm điều đó trong câu trả lời được chấp nhận.
scharette

Câu trả lời:


1238

Để phân chia theo chuỗi, bạn sẽ phải sử dụng quá tải mảng chuỗi .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4
Tôi thực sự đã thay đổi câu trả lời của mình cho điều này vì 2 lý do: # 1: Để xử lý các phần tách tôi muốn làm, tôi sẽ cần sử dụng Regex.Escape, vì chuỗi phân tách của tôi thường chứa dấu hoa thị, v.v ... # 2: Trong khi chương trình này Tôi đang viết không cần tối ưu hóa thực sự, dường như có thêm chi phí liên quan đến việc sử dụng phương pháp Regex Split.
Brandon

7
@Peter: Trong bài đăng đó, Jon đang đề xuất nó vì người đăng không có dấu phân cách cố định; anh ta đang tìm cách phân tách các chuỗi cách nhau bởi "nhiều hơn một khoảng trắng" (nghĩa là 2+). Đối với các chuỗi được giới hạn bởi một mẫu chứ không phải là một giá trị , RegEx là một tùy chọn tuyệt vời (tốt, duy nhất ). Đối với các dấu phân cách giá trị cố định, nó giới thiệu chi phí không cần thiết. Hãy thử chạy thử nghiệm; khi số lượng hoạt động tăng lên, RegEx cuối cùng sẽ mất khoảng ~ 10 lần miễn là tương ứng string.Split.
Adam Robinson

9
Tôi đến từ Python đến C #. Python hỗ trợ phân tách chuỗi bởi một chuỗi khác. Và tôi thường xuyên cần quay lại câu hỏi này để có câu trả lời đơn giản string[] Split(string pattern), đó là cách sử dụng tự nhiên nhất mà tôi có thể nghĩ đến nhưng nó không có ở đó. Tôi đã viết C trước đây vì vậy tôi đã quen với mảng char nhưng tôi vẫn ghét phải thấy char[]bật lên trong mã C # vì nó đột nhiên kéo sự chú ý của tôi từ mức luồng sang mức byte. Có ai biết tại sao những người trong thư viện C # lại thiết kế phương pháp Split như thế này không? Nếu có một lý do chính đáng, tôi có thể cố gắng đánh giá cao nó bất chấp sự bất tiện.
tầm nhìn xa

11
Đoạn trích này xếp hạng rất cao trong danh sách những điều tôi cảm thấy xấu hổ khi hiển thị cho các nhà phát triển không C #.
Traubenfuchs

98
Tại sao chúng ta không thể làm gì data.Split("xx")?
mcont

122

Có một sự quá tải của Split có chuỗi.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

Bạn có thể sử dụng một trong hai StringSplitOptions này

  • Không có - Giá trị trả về bao gồm các phần tử mảng có chứa một chuỗi rỗng
  • RemoveEmptyEntries - Giá trị trả về không bao gồm các phần tử mảng có chứa một chuỗi rỗng

Vì vậy, nếu chuỗi là "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.Nonesẽ trả về một mục trống trong mảng cho phần "xxxx" trong khi StringSplitOptions.RemoveEmptyEntriessẽ không.


73
Regex.Split(string, "xx")

là cách tôi thường làm


Tất nhiên bạn sẽ cần:

using System.Text.RegularExpressions;

hoặc là :

System.Text.RegularExpressions.Regex.Split(string, "xx")

nhưng sau đó một lần nữa tôi cần thư viện đó mọi lúc.


13
@Brandon: Mặc dù tôi thường cảnh báo về việc tối ưu hóa sớm, bạn nên lưu ý rằng việc RegEx.Splitnày khá tốn kém hơn một chút so với đơn giản String.Splitvì chi phí biểu hiện thông thường.
Adam Robinson

9
Nếu bạn muốn phân tách bằng một chuỗi tùy ý, Regex.Escapetrước tiên hãy sử dụng chuỗi đó, điều này sẽ thoát khỏi bất kỳ ký tự meta regex nào.
Richard

một trong những lợi thế chính có thể trả cho chi phí hoạt động là khả năng cung cấp cài đặt so sánh chuỗi
Timur Sadykov

47

Có quá tải String.Split cho việc này:

"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);

1
Câu trả lời duy nhất loại bỏ khai báo kiểu mảng không cần thiết.
wonea

25

Tôi thường thích sử dụng tiện ích mở rộng của riêng mình cho điều đó:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

Tuy nhiên, điều này sẽ dẫn đến Ngoại lệ, nếu Microsoft quyết định đưa phương thức này - quá tải trong các phiên bản sau. Đó cũng là lý do có thể khiến Microsoft không đưa phương thức này vào lúc này: Ít nhất một công ty tôi làm việc, đã sử dụng một phần mở rộng như vậy trong tất cả các dự án C # của họ.

Cũng có thể định nghĩa một cách có điều kiện phương thức trong thời gian chạy nếu nó không tồn tại.


4
Ngoài ra, sử dụng params string[] splitternhư tham số thứ hai và thay đổi new[] {splitter}để splitterhỗ trợ nhiều delimiters.
Matthew Strawbridge

10

Các câu trả lời trước đây đều đúng. Tôi tiến thêm một bước và làm cho C # hoạt động với tôi bằng cách xác định phương thức mở rộng trên Chuỗi:

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

Bằng cách đó tôi có thể gọi nó trên bất kỳ chuỗi nào theo cách đơn giản mà tôi mong đợi một cách ngây thơ ngay lần đầu tiên tôi cố gắng thực hiện điều này:

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

Chỉ cần chọn ký tự thay thế một cách cẩn thận (chọn một ký tự không có khả năng có mặt trong chuỗi)!


2
@MasoudHosseini: Vui lòng đọc câu trả lời đầy đủ; đã từ chối trách nhiệm.
SNag

3
@kobe: Bởi vì đó là một vụ hack khủng khiếp.
Vượt qua

3
Hoạt động tốt, nhưng nó nguy hiểm cho các phương pháp chung
Kaizonaro

5
Đăng những lời giải thích như, "Đó là một vụ hack khủng khiếp" hoặc "một câu trả lời tồi" không hữu ích. Nó chỉ đơn giản là một ý kiến ​​mà không cần giải thích. Thay vào đó, hãy nêu một cái gì đó như "Không cần thiết phải quét cả chuỗi để thay thế và sau đó quét các ký tự phân tách vì nó dẫn đến hiệu suất kém." sẽ là một cách tốt hơn để giải thích chính mình. Quá nhiều lập trình viên hành động theo cách này. :(
Matt Ruwe

1
Điều gì sẽ xảy ra nếu chuỗi đã chứa |char, vì lý do này tôi nghĩ rằng nó nguy hiểm khi sử dụng.
AMD

-1

Điều này cũng dễ dàng:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
Nhưng điều này cũng sẽ bị chia tách "THExQUICK"khi chúng ta không muốn nó bị chia tách
Rafalon

Cảm ơn Rafalon: có, Greg's là câu trả lời hay nhất: data.Split (chuỗi mới [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
user890255

-4

Cách dễ nhất là sử dụng String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

Hay đơn giản hơn:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
Như vậy, điều này sẽ không trả về một mảng (như câu hỏi yêu cầu), chỉ là một chuỗi có dấu phẩy nơi xxcó.
Arj

Và không chỉ vậy nếu chuỗi chứa dấu phẩy bổ sung, bạn sẽ không thể phân tách các từ một cách chính xác.
dùng3658298
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.