2012-11-30 23 views
5

Ho una domanda sulla divisione della stringa. Voglio dividere la stringa, ma quando nella stringa vedi i caratteri "" quindi non dividere e rimuovere gli spazi vuoti.Dividere la stringa in serie, rimuovere gli spazi vuoti

mio String:

String tmp = "abc 123 \"Edk k3\" String;"; 

Risultato:

1: abc 
2: 123 
3: Edkk3 // don't split after "" and remove empty spaces 
4: String 

Il mio codice per il risultato, ma non so come rimuovere gli spazi vuoti in ""

var tmpList = tmp.Split(new[] { '"' }).SelectMany((s, i) => 
       { 
        if (i % 2 == 1) return new[] { s }; 
        return s.Split(new[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries); 
       }).ToList(); 

Or ma questo non vede "", quindi divide tutto

string[] tmpList = tmp.Split(new Char[] { ' ', ';', '\"', ',' }, StringSplitOptions.RemoveEmptyEntries); 

risposta

8

Aggiungi .Rimontare ("", '')

String tmp = @"abc 123 ""Edk k3"" String;"; 
var tmpList = tmp.Split(new[] { '"' }).SelectMany((s, i) => 
{ 
    if (i % 2 == 1) return new[] { s.Replace(" ", "") }; 
    return s.Split(new[] { ' ', ';' }, StringSplitOptions.RemoveEmptyEntries); 
}).ToList(); 
0

string.Split non è adatto a ciò che si vuole fare, come non si può dire di ignorare ciò che è nella ".

Non andrei neanche con Regex, in quanto ciò può risultare complicato e richiede molta memoria (per stringhe lunghe).

Implementare il proprio parser - utilizzando una macchina a stati per verificare se ci si trova all'interno di una porzione quotata.

0

È possibile utilizzare un'espressione regolare. Invece di dividere, specifica ciò che vuoi mantenere.

Esempio:

string tmp = "abc 123 \"Edk k3\" String;"; 

MatchCollection m = Regex.Matches(tmp, @"""(.*?)""|([^ ]+)"); 

foreach (Match s in m) { 
    Console.WriteLine(s.Groups[1].Value.Replace(" ", "") + s.Groups[2].Value); 
} 

uscita:

abc 
123 
Edkk3 
String; 
Problemi correlati