2013-03-14 22 views
7

Próbuję podzielić ciąg w C# w następujący sposób:Dzielenie ciąg w C#

Przychodzący łańcuch jest w formie

string str = "[message details in here][another message here]/n/n[anothermessage here]" 

I staram się podzielić ją na tablicę łańcuchów w postaci

string[0] = "[message details in here]" 
string[1] = "[another message here]" 
string[2] = "[anothermessage here]" 

starałem się zrobić to w taki sposób, jak to

string[] split = Regex.Split(str, @"\[[^[]+\]"); 

Ale to nie działa poprawnie w ten sposób, właśnie dostaję pustą tablicę lub ciągi znaków

Każda pomoc będzie doceniona!

+7

'Ale to nie działa poprawnie w ten sposób" - proszę o szczegóły. Co przez to rozumiesz? czy rzuca wyjątek? czy nie przynosi oczekiwanego rezultatu? Jeśli tak, to co on produkuje? możesz to opublikować? Zadaj pytanie poprawnie, w przeciwnym razie szybko dostaniesz downwrotes i krótkie głosy. –

+0

użyj jednej z przeciążeń metody Split() w klasie ciągów. –

+0

Zastąp wszystkie ciągi linii pustymi ciągami, a następnie podziel na "] [". –

Odpowiedz

15

użyć metody Regex.Matches zamiast:

string[] result = 
    Regex.Matches(str, @"\[.*?\]").Cast<Match>().Select(m => m.Value).ToArray(); 
8

Metoda Split zwraca podstanów między wystąpień określonego wzoru. Na przykład:

var items = Regex.Split("this is a test", @"\s"); 

Wyniki w tablicy [ "this", "is", "a", "test" ].

Zamiast tego należy użyć Matches.

var matches = Regex.Matches(str, @"\[[^[]+\]"); 

Następnie można użyć LINQ do łatwo dostać tablicę dopasowanych wartości:

var split = matches.Cast<Match>() 
        .Select(m => m.Value) 
        .ToArray(); 
+0

Czy przetestowałeś przykład "Split"? Pomijając nieumiejętne opuszczenie '\ w', wynik, o którym wspomniałeś, jest całkowicie błędny. –

+0

@KennethK Dzięki. Napisałem tę zmianę w drodze do drzwi i nie miałem szansy na jej korektę. Naprawiłem to. –

-1

Zamiast regex można użyć Split metoda na łańcuchu tak, jak to

Split(new[] { '\n', '[', ']' }, StringSplitOptions.RemoveEmptyEntries) 

Za pomocą tej metody stracisz [ i ] wokół wyników, ale w razie potrzeby nie jest to trudne.

+0

Spowoduje to również podział na '\ n' między' ['i'] '. Nie sądzę, że tego właśnie chce OP –

0

Inną opcją byłoby użycie asercji lookaround do podziału.

np.

string[] split = Regex.Split(str, @"(?<=\])(?=\[)"); 

To podejście skutecznie dzieli się na pustej przestrzeni między nawiasami zamykającymi i otwierającymi.