2014-10-10 21 views
6

Domanda: Come si scrive un'espressione per dividere una stringa su ',' ma non su '/,'? In seguito, sostituirò '/,' con ', '.Divisione su "," ma non "/,"

Dettagli ...

delimitatori: ','

Skip Char: '/'

Esempio ingresso: "Mister,Bill,is,made,of/,clay"

Voglio dividere questo ingresso in un array : {"Mister", "Bill", "is", "made", "of, clay"}

So come farlo con uno char prev, cur; e alcuni indicizzatori, ma sembra beta.

Java Regex ha una funzionalità divisa, ma non so come replicare questo comportamento in C#.

Nota: questa non è una domanda duplicata, è la stessa domanda, ma per una lingua diversa.

+0

Il delimitatore e saltare char sono const tenuti in una classe mondiale. Dovrebbero essere in grado di cambiare. – visc

+0

In definitiva, cosa vuoi fare? – Robin

+2

Sono in procinto di creare la mia lettura/scrittura CSV. Abbiamo dato un'occhiata a csvHelper ma ha fornito più funzionalità del necessario. Sto cercando di caricare un file CSV in una struttura List . Sto cercando un modo semplice per passare da csv a array. – visc

risposta

8

credo siete alla ricerca di un negative lookbehind:

var regex = new Regex("(?<!/),"); 
var result = regex.Split(str); 

questo dividerà str su tutte le virgole che sono no t preceduto da una barra. Se si desidera mantenere il '/,' nella stringa, questo funzionerà per voi.

Dal momento che lei ha detto che si voleva dividere la stringa e successivamente sostituire il '/,' con ', ', ti consigliamo di fare quanto sopra prima poi è possibile iterare il risultato e sostituire le stringhe in questo modo:

var replacedResult = result.Select(s => s.Replace("/,", ", "); 
0

basta usare un Sostituisci per rimuovere le virgole dalla stringa:

s.Replace("/,", "//").Split(',').Select(x => x.Replace("//", ",")); 
+5

che sembra ottimista. chi dice che i dati non contengano già "//"? – ths

3
string s = "Mister,Bill,is,made,of/,clay"; 
var arr = s.Replace("/,"," ").Split(','); 

risultato: {"Mister", "Bill", "is", "made", "of clay"}

+0

Il tuo è l'unico che fa effettivamente ciò che è stato richiesto, il che è molto più facile di quanto tutti lo abbiano dimostrato. (perché voleva '/,' sostituito con uno spazio, come evidenziato dai suoi esempi) –

+6

Ma _ "Più tardi dovrò sostituire '/,' con ','" _. Sembra che l'ultimo oggetto dell'array finale debba essere: 'of, clay'. Con il tuo approccio le informazioni sono perse dove devi inserire quella virgola. –

+1

La domanda è stata modificata in modo che l'output di esempio sia ora diverso rispetto a quando ha risposto. –

2

Utilizzando Regex:

var result = Regex.Split("Mister,Bill,is,made,of/,clay", "(?<=[^/]),"); 
+2

un look positivo con un carattere negato? Sembra contorto. –

+0

@LukeWillis: Infatti, 'Regex.Split (", x "," (? <= [^ /]), ")' Restituisce '{", x "}' ma mi aspetto che '{" "," x "}'. – Gabe

+0

@Gabe perché è necessario che ogni virgola sia preceduta da un carattere che non è una barra. –

0

È possibile utilizzare questo in C#

string regex = @"(?:[^\/]),"; 
var match = Regex.Split("Mister,Bill,is,made,of/,clay", regex, RegexOptions.IgnoreCase); 

Dopo di che è possibile sostituire /, e continuare l'operazione come ti piace

+1

-1, il codice restituito '" Miste ", " Bil ", " i ", " pazzo ", " di /, argilla "' , che non è chiaramente corretto. – Gabe

+0

Questo perché '(?: )' è un gruppo di acquisizione. Quindi, qualsiasi carattere non-slash prima che una virgola venga consumato da 'Split'. –

Problemi correlati