string.split - przez separator wielu znaków


151

Mam problem z podziałem ciągu w języku C # z ogranicznikiem „] [”.

Na przykład ciąg „abc] [rfd] [5] [,] [.”

Powinien dać tablicę zawierającą;
abc
RFD
5
,
.

Ale nie wydaje mi się, aby to działało, nawet jeśli wypróbuję RegEx, nie mogę uzyskać podziału na separatorze.

EDYCJA: Zasadniczo chciałem rozwiązać ten problem bez potrzeby używania wyrażenia regularnego. Rozwiązanie, które akceptuję, to;

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

Cieszę się, że mogę rozwiązać to podzielone pytanie.

c#  split 

Pokaż nam swój kod, który nie działa.
— Konrad Rudolph

Poza tym, napisz proszę, co z tego masz, oprócz tego, co opublikowałeś, co chcesz z tego wyciągnąć.
— Lasse V. Karlsen

Odpowiedzi:


268

Aby pokazać oba string.Spliti Regexużycie:

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

5
Lub jeśli twój minimalny kod jest podobny do mnie: 'var parts1 = input.Split (new [] {"] ["}, StringSplitOptions.None);'
— Paul Grimshaw,

2
Jaka jest korzyść z zapewnienia StringSplitOptions.Noneponad input.Split(new string[] { "][" })?
— seebiscuit

1
To zakłada, że ​​istnieją obie postacie, prawda? A jeśli chcę podzielić przez „[” lub „]”? Z moich dotychczasowych testów myślę, że to inna historia, prawda?
— C4d

Dziękuję, to działa !!
— Kumar

3
@ C4u String.Split("[]".ToCharArray())to będzie podzielone przez oba [i] oddzielnie. Na przykład: Hello [World] Its [Me! brzmiałoby: Hello, World, Its, Me!
— Ma Dude,

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

8
Zauważ, że to podejście zakłada, że ​​oznacza to podział na wszystkie] i [, nawet jeśli nie pojawiają się one w kombinacji] [.
— Lasse V. Karlsen

2
Przeciążenie ciągu. Split traktuje go jako 2 oddzielne ograniczniki - po prostu odrzucasz resztę. Istnieje przeciążenie, które akceptuje ciąg jako separator (w rzeczywistości tablicę ciągów) - więc nie musisz usuwać pustych wartości (co oznacza również: możesz znaleźć puste wartości, jeśli istnieją one prawidłowo w danych)
— Marc Gravell

Twoje] założenie jest [poprawne. Nie sprecyzował, więc dałem mu coś, co zadziała na jego przykład. Jeśli nie chce ich pominąć, to zadziała. Ale bez dodatkowych informacji nigdy się nie dowiemy
— SwDevMan81

To co ja szukałem. W pytaniu był to prosty problem, ale to zaawansowana odpowiedź.
— Bitterblue

To było dokładnie to, czego szukałem. Ale prawidłowa odpowiedź to także dla mnie wiadomość, nie wiedziałem, że możesz podzielić się z więcej niż jedną postacią, jak opisał Marc. Składnia jest dość kiepska.
— Piotr Kula

13

Inna opcja:

Zastąp ogranicznik ciągu pojedynczym znakiem, a następnie podziel na ten znak.

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

1
Tym się właśnie zajmuję. Daje mi znormalizowaną, ogólną metodę, która działa na wszystkich platformach bez martwienia się o sztuczki specyficzne dla platformy.
— David Betz,

5
Nie jest to dobry pomysł. Rozważmy: string input = "abc][rf-d][5". „-” w „rf-d” zostanie przechwycony jako separator. Zamiast tego zobacz zaakceptowaną odpowiedź powyżej.
— Gilad Barner

W takim przypadku zamień i podziel na mało prawdopodobny znak, taki jak ~ lub `lub nawet znak spoza klawiatury, taki jak ¿lub ◙ itp.
— labraks2020

1
Podoba mi się rozwiązanie na wypadek, gdyby było jasne, solidne i można je znormalizować. Moje użycieDim Levels As New List(Of String)(newSelectedTask.Replace(LevelDelimter, Chr(13)).Split(Chr(13)))
— Nasenbaer

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.