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 № 1La 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.