/ / Selezione di tutto tranne l'elemento specifico nella stringa - c #

Selezione di tutto tranne Articolo specifico in stringa - c #

Scusa se il titolo è vago

Ho una stringa come questa: var curStr = "39bta,1q7l,vlaya,zkfaa,bc[ke],cc[b7ic,h7ko,c4ic]";
Quello che devo fare è selezionare tutti gli ID, tranne per quelli direttamente dietro a [ (Quindi no bc o cc)

Ho tentato questo problema con quanto segue:

var initSplit = curStr.Split("[");
var count = initSplit.Count();
List<String> z = new List<string>();

for (int i = 0; i < count; i++)
{
var y = initSplit[i].Split(",");
var i1 = i;
var t = y.Where(x => x != initSplit[i1].Split(",").Last()).ToList();
z.AddRange(t.Select(u => u.Replace("]", String.Empty)));
}

var stringArray = String.Join(",", z.ToArray());

Che funziona esattamente come lo voglio io, e lo inserisce in un CSL, tuttavia ignora l'ultimo elemento (c4ic - Probabilmente a causa della parte .Last ()). C'è un modo più pulito o più elegante per farlo?

risposte:

3 per risposta № 1

La chiesa di una linea:

var x = curStr
.Split(",")
.Select(y => y.Contains("[") ? y.Split("[").Skip(1).First() : y )
.Select(z => z.Replace("]",string.Empty));

0 per risposta № 2

Il problema principale è estrarre gli oggetti interni. se tagli in virgole avrai elementi come cc[b7ic. Quindi puoi semplicemente usare un Regex per sbarazzarti della parte anteriore:

var items = curStr
.Split(",")
.Select(item => Regex.Replace(item, @"[^[]*[(.*)", "$1").Replace("]", ""));

var result = string.Join(",",items);

0 per risposta № 3

Puoi usare questa espressione regolare:

string pattern = @",([a-z]*)[";
string replacement = ",";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(curStr, replacement);
result = result.Replace("]","");
string[] array_result = result.Split(",");

0 per risposta № 4

Qualcosa di simile dovrebbe funzionare:

// If you don"t need ] let"s remove it first and split on comma
var parts =  curStr.Replace("]","").Split(",");

// get the parts that contains [,
// split them and get only those parts that comes after [
// by checking the index
var p2 = parts
.Where(x => x.Contains("["))
.SelectMany(x => x.Split("[").Where((a, idx) => idx % 2 != 0));

// concat them into one list
var result = parts.Where(x => !x.Contains("[")).Concat(p2).ToList();

Questo non gestirà casi come bc[[, Puoi usare x.Split(new [] { "[" }, StringSplitOptions.RemoveEmptyEntries) per gestire anche quei casi.

Fiddle