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.


źródło
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
2
Możliwy duplikat Podziel ciąg przez inny ciąg w C #
puzzlepiece87

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, @"\]\[");
Marc Gravell
źródło
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);
SwDevMan81
źródło
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('-');
labraks2020
źródło
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
2
Regex.Split("abc][rfd][5][,][.", @"\]\]");
Christopher Klewes
źródło