2013-03-14 11 views
7

Sto cercando di dividere una stringa in C# seguente modo:suddivisione di un testo in C#

stringa in entrata è in forma

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

E sto cercando di dividerlo in un array di stringhe nella forma

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

stavo cercando di farlo in un modo come questo

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

Ma non funziona correttamente in questo modo, sto solo ricevendo una matrice vuota o stringhe

Qualsiasi aiuto sarebbe apprezzato!

+7

'Ma non funziona correttamente in questo modo' - Si prega di essere specifici. Che cosa vuoi dire con questo? fa un'eccezione? non produce il risultato atteso? Se sì, cosa produce? puoi pubblicare quello? Per favore, poni la tua domanda correttamente, altrimenti otterrai i downvotes e chiudi rapidamente i voti qui. –

+0

usa uno dei sovraccarichi del metodo Split() sulla classe string. –

+0

Sostituisci tutti i linefeed con stringhe vuote, quindi dividi su "] [". –

risposta

15

Utilizzare il metodo Regex.Matches invece:

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

Il metodo Split restituisce le sottosezioni tra le istanze del modello specificato. Ad esempio:

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

Risultati nell'array [ "this", "is", "a", "test" ].

La soluzione è utilizzare invece Matches.

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

È quindi possibile utilizzare LINQ per ottenere facilmente una matrice di valori corrispondenti:

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

Hai testato il tuo esempio di 'Split'? A parte non scappare correttamente il '\ w', il risultato che hai citato è completamente sbagliato. –

+0

@KennethK Grazie. Ho scritto quella modifica mentre uscivo dalla porta e non ho avuto la possibilità di correggerlo. L'ho riparato. –

-1

Invece di usare una regex è possibile utilizzare il Split metodo sulla stringa in modo tale

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

Perderai [ e ] in base ai tuoi risultati con questo metodo, ma non è difficile aggiungerli di nuovo secondo le necessità.

+0

Questo interromperà anche '\ n' tra' ['e'] '. Non penso che sia ciò che OP vuole –

0

Un'altra opzione potrebbe essere quella di utilizzare asserzioni di ricerca per la suddivisione.

ad es.

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

Questo approccio si divide efficacemente nel vuoto tra una staffa quadrata di apertura e apertura.

Problemi correlati