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.