2014-10-23 2 views
2

Пожалуйста, простите, если название расплывчатогоВыбора все, кроме заданного элемента в строке

У меня есть строка, как это: var curStr = "39bta,1q7l,vlaya,zkfaa,bc[ke],cc[b7ic,h7ko,c4ic]";
Что мне нужно сделать, это выбрать все идентификаторы, кроме для из них непосредственно позади [ (Так не bc или cc)

Я попытался эту проблему следующим:

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()); 

Который работает точно, как я хочу его, и помещает его в CSL, однако он игнорирует последний элемент (c4ic - Вероятно, из-за .Last() части). Есть ли более чистый или более элегантный способ сделать это?

+0

«Непосредственно * за * а' [ '» ... не так означают прямо перед (перед) '' ''? –

+0

До этого: '' '' '' перед '' '', и он не будет выбран. – TheGeekZn

+0

Вы имеете в виду, что он игнорирует 'c4ic' вместо' c41c'? – juharr

ответ

3

Церковь одной линии:

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

Это умно. Лучше, чем моя версия в регулярном выражении. – Jonesopolis

+0

это не удастся, если часть содержит более одного '[' –

+1

@ Selman22 - Я могу думать о многих входах, которые могут привести к сбою. Я могу писать только на указанные требования. – Hogan

0

Что-то, как это должно работать:

// 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(); 

Это не будет рассматривать дела как bc[[, вы можете использовать x.Split(new [] { '[' }, StringSplitOptions.RemoveEmptyEntries) обрабатывать эти случаи.

Fiddle

+0

Две вещи - вы переопределяете x во внутренней лямбда, вызывая проблемы с компиляцией (я отмечаю, что вы исправили ее в своей скрипке, но не здесь). Также стоит отметить, что это не сохраняет порядок, который может или не может быть важен (исходный образец, но он не указан как требование). – Chris

0

Основная проблема тянет внутренние детали вне. если вы щелкаете запятыми, у вас будут такие предметы, как cc[b7ic. Тогда вы можете просто использовать Regex, чтобы избавиться от передней части:

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

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

Вы можете использовать это регулярное выражение:

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(',');