string.split - dal delimitatore di più caratteri


151

sto riscontrando problemi a dividere una stringa in c # con un delimitatore di "] [".

Ad esempio la stringa "abc] [rfd] [5] [,] [."

Dovrebbe produrre un array contenente;
abc
RFD
5
,
.

Ma non riesco a farlo funzionare, anche se provo RegEx non riesco a ottenere una divisione sul delimitatore.

EDIT: essenzialmente volevo risolvere questo problema senza la necessità di un'espressione regolare. La soluzione che accetto è;

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

Sono felice di essere in grado di risolvere questa domanda divisa.

c#  split 

Mostraci il tuo codice che non funziona.
— Konrad Rudolph,

Inoltre, si prega di pubblicare ciò che si ottiene da esso, oltre a ciò che è stato pubblicato, ciò che si desidera ottenere da esso.
— Lasse V. Karlsen,

Risposte:


268

Per mostrare sia string.Splite l' Regexutilizzo:

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

5
O se il tuo anal minimo di codice mi piace: 'var parts1 = input.Split (new [] {"] ["}, StringSplitOptions.None);'
— Paul Grimshaw,

2
Qual è il vantaggio di fornire l' StringSplitOptions.Noneover input.Split(new string[] { "][" })?
— SeeBiscuit

1
Ciò presuppone che ci siano entrambi i personaggi, giusto? Cosa succede se desidero dividere per "[" o "]"? Dai miei test fino ad ora immagino che sia una storia diversa, giusto?
— C4d

Grazie, funziona !!
— Kumar,

3
@ C4u String.Split("[]".ToCharArray())questo sarebbe diviso per [e] separatamente. Ad esempio: Hello [World] Its [Me! sarebbe: Hello, World, Its, Me!
— Ma Dude,

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

8
Si noti che questo approccio presuppone che intende dividere su ogni] e [, anche quando non compaiono nella combinazione] [.
— Lasse V. Karlsen,

2
Quel sovraccarico di stringa.Split lo sta trattando come 2 delimitatori separati - semplicemente stai scartando il resto. C'è un sovraccarico che accetta una stringa come delimitatore (in realtà, una matrice di stringhe) - quindi non è necessario rimuovere i valori vuoti (che significa anche: puoi trovare valori vuoti quando esistono validamente nei dati)
— Marc Gravell

Il tuo] presupposto è [corretto. Non ha specificato, quindi gli ho dato qualcosa che avrebbe funzionato per il suo esempio. Se non vuole saltarli, allora funzionerebbe. Ma senza ulteriori informazioni, non lo sapremo mai
— SwDevMan81

Questo è quello che stavo cercando. Nella domanda era un problema semplice ma questa è una risposta avanzata.
— Bitterblue,

Era esattamente quello che stavo cercando. Ma la risposta corretta è anche una novità per me, non sapevo che potevi dividerti con più di un personaggio come descritto da Marc. La sintassi è piuttosto spazzatura.
— Piotr Kula,

13

Un'altra opzione:

Sostituisci il delimitatore di stringa con un singolo carattere, quindi dividi quel carattere.

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

1
Questo è ciò che faccio. Mi dà un metodo normalizzato e generale che funziona su tutte le piattaforme senza doversi preoccupare di trucchi specifici della piattaforma.
— David Betz,

5
Non è una buona idea. Prendere in considerazione: string input = "abc][rf-d][5". Il "-" in "rf-d" verrà catturato come delimitatore. Vedi invece la risposta accettata sopra.
— Gilad Barner,

In tal caso, sostituisci con e dividi un carattere improbabile come ~ o `o anche un carattere non tastiera come ¿o ◙ ecc.
— seabass2020

1
Mi piace la soluzione nel caso in cui sia chiara, robusta e possa diventare normalizzata. Il mio utilizzoDim Levels As New List(Of String)(newSelectedTask.Replace(LevelDelimter, Chr(13)).Split(Chr(13)))
— Nasenbaer,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.