chuỗi.split - bởi dấu phân cách nhiều ký tự


151

tôi gặp sự cố khi tách một chuỗi trong c # với dấu phân cách là "] [".

Ví dụ: chuỗi "abc] [rfd] [5] [,] [."

Nên mang lại một mảng chứa;
abc
rfd
5
,
.

Nhưng tôi dường như không thể làm cho nó hoạt động được, ngay cả khi tôi dùng thử RegEx, tôi không thể có được sự phân chia trên dấu phân cách.

EDIT: Về cơ bản tôi muốn giải quyết vấn đề này mà không cần phải có Biểu thức chính quy. Giải pháp mà tôi chấp nhận là;

string Delimiter = "][";  
var Result[] = StringToSplit.Split(new[] { Delimiter }, StringSplitOptions.None);

Tôi vui mừng khi có thể giải quyết câu hỏi chia này.

c#  split 

Cho chúng tôi thấy mã của bạn không thành công.
Konrad Rudolph

Ngoài ra, vui lòng đăng những gì bạn làm ra khỏi nó, ngoài những gì bạn đã đăng, những gì bạn muốn thoát khỏi nó.
Lasse V. Karlsen

Câu trả lời:


268

Để hiển thị cả hai string.SplitRegexcách sử dụng:

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Split(new string[] { "][" }, StringSplitOptions.None);
string[] parts2 = Regex.Split(input, @"\]\[");

5
Hoặc nếu mã tối thiểu của bạn hậu môn như tôi: 'var part1 = input.Split (new [] {"] ["}, StringSplitOptions.None);'
Paul Grimshaw

2
Lợi ích của việc cung cấp StringSplitOptions.Nonehơn là input.Split(new string[] { "][" })gì?
seebcakes

1
Điều này giả định, rằng có cả hai nhân vật phải không? Điều gì xảy ra nếu tôi muốn chia theo "[" hoặc "]"? Từ các thử nghiệm của tôi cho đến nay tôi đoán đó là một câu chuyện khác nhau, phải không?
C4d

Cảm ơn bạn, nó hoạt động !!
Kumar

3
@ C4u String.Split("[]".ToCharArray())này sẽ được phân chia bởi cả [và] riêng biệt. Ví dụ: Xin chào [Thế giới] Đó là [Tôi! sẽ là: Xin chào, Thế giới, Nó, Tôi!
Ma Dude

36
string tests = "abc][rfd][5][,][.";
string[] reslts = tests.Split(new char[] { ']', '[' }, StringSplitOptions.RemoveEmptyEntries);

8
Lưu ý rằng phương pháp này giả định rằng anh ta có nghĩa là chia tách trên mọi] và [, ngay cả khi chúng không xuất hiện trong kết hợp] [.
Lasse V. Karlsen

2
Sự quá tải của chuỗi.Split đang coi nó như 2 dấu phân cách riêng biệt - đơn giản là bạn đang loại bỏ phần còn lại. Có một sự quá tải chấp nhận một chuỗi như một dấu phân cách (thực ra là một chuỗi các chuỗi) - vì vậy bạn không phải xóa các giá trị trống (cũng có nghĩa là: bạn có thể tìm thấy các giá trị trống khi chúng tồn tại hợp lệ trong dữ liệu)
Marc Gravell

Giả định của bạn là [chính xác. Anh ấy đã không chỉ định, vì vậy tôi đã đưa cho anh ấy một cái gì đó sẽ làm việc cho ví dụ của anh ấy. Nếu anh ta không muốn bỏ qua chúng, thì sẽ làm việc. Nhưng không có thêm thông tin, chúng tôi sẽ không bao giờ biết
SwDevMan81

Đó là những gì tôi đang tìm kiếm. Trong câu hỏi đó là một vấn đề đơn giản nhưng đây là một câu trả lời nâng cao.
Bitterblue

Đó chính xác là những gì tôi đang tìm kiếm. Nhưng câu trả lời chính xác cũng là tin tức với tôi, không biết bạn có thể chia tay với nhiều hơn một nhân vật như Marc mô tả. Cú pháp khá rác.
Piotr Kula

13

Một lựa chọn khác:

Thay thế dấu phân cách chuỗi bằng một ký tự đơn, sau đó phân tách trên ký tự đó.

string input = "abc][rfd][5][,][.";
string[] parts1 = input.Replace("][","-").Split('-');

1
Đây là những gì tôi làm. Nó mang lại cho tôi một phương pháp chung, chuẩn hóa, hoạt động trên tất cả các nền tảng mà không phải lo lắng về các thủ thuật dành riêng cho nền tảng.
David Betz

5
Không phải là một ý tưởng tốt. Hãy xem xét : string input = "abc][rf-d][5". "-" trong "rf-d" sẽ được xem là dấu phân cách. Xem câu trả lời được chấp nhận ở trên thay thế.
Gilad Barner

Trong trường hợp đó, thay thế và phân tách trên một ký tự không chắc chắn như ~ hoặc `hoặc thậm chí là một ký tự không phải bàn phím, chẳng hạn như hoặc ◙, v.v.
seabass2020

1
Tôi thích giải pháp trong trường hợp rõ ràng, mạnh mẽ và có thể trở nên bình thường hóa. Cách sử dụng của tôiDim Levels As New List(Of String)(newSelectedTask.Replace(LevelDelimter, Chr(13)).Split(Chr(13)))
Nasenbaer

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.