2013-02-14 3 views
5

У меня есть список строк, как это:C# Получить подстроку с определенной схемой из строки

List<string> list = new List<string>(); 
list.Add("Item 1: #item1#"); 
list.Add("Item 2: #item2#"); 
list.Add("Item 3: #item3#"); 

Как я могу получить и добавить подстроки # ITEM1 #, # # item2 и т.д. в новый список?

я только в состоянии получить полную строку, если она содержит символ «#», делая это:

foreach (var item in list) 
{ 
    if(item.Contains("#")) 
    { 
     //Add item to new list 
    } 
} 
+0

что-то с этими функциями: подстрока (FirstIndexOf ('#'), LastIndexOf ('#')); – Karl

+1

Что вернуть, если строка не содержит часть '# item #'? –

ответ

8

Вы могли бы посмотреть на Regex.Match. Если вы знаете немного о регулярных выражениях (в вашем случае это будет довольно простой шаблон: "#[^#]+#"), вы можете использовать его для извлечения всех элементов, начиная и заканчивая '#', с любым количеством других символов, кроме '#' между ними.

Пример:

Match match = Regex.Match("Item 3: #item3#", "#[^#]+#"); 
if (match.Success) { 
    Console.WriteLine(match.Captures[0].Value); // Will output "#item3#" 
} 
0

Как об этом:

List<string> substring_list = new List<string>(); 
foreach (string item in list) 
{ 
    int first = item.IndexOf("#"); 
    int second = item.IndexOf("#", first); 
    substring_list.Add(item.Substring(first, second - first); 
} 
0

Вы можете сделать это просто с помощью:

List<string> list2 = new List<string>(); 
    list.ForEach(x => list2.Add(x.Substring(x.IndexOf("#"), x.Length - x.IndexOf("#")))); 
0

попробовать это.

var itemList = new List<string>(); 
foreach(var text in list){ 
string item = text.Split(':')[1]; 
itemList.Add(item); 


} 
1

LINQ будет делать работу хорошо:

var newList = list.Select(s => '#' + s.Split('#')[1] + '#').ToList(); 

Или, если вы предпочитаете выражения запроса:

var newList = (from s in list 
       select '#' + s.Split('#')[1] + '#').ToList(); 

В качестве альтернативы, вы можете использовать регулярные выражения, как это было предложено с Botz3000 и объединить тех, с LINQ:

var newList = new List(
    from match in list.Select(s => Regex.Match(s, "#[^#]+#")) 
    where match.Success 
    select match.Captures[0].Value 
); 
1

Код решит вашу проблему. Но если строка не содержит#item#, тогда будет использована исходная строка.

var inputList = new List<string> 
    { 
     "Item 1: #item1#", 
     "Item 2: #item2#", 
     "Item 3: #item3#", 
     "Item 4: item4" 
    }; 

var outputList = inputList 
    .Select(item => 
     { 
      int startPos = item.IndexOf('#'); 
      if (startPos < 0) 
       return item; 

      int endPos = item.IndexOf('#', startPos + 1); 
      if (endPos < 0) 
       return item; 
      return item.Substring(startPos, endPos - startPos + 1); 
     }) 
    .ToList(); 
2

Вот еще один способ использования регулярного выражения с LINQ. (Не уверен, что ваши точные требования ссылаются на регулярное выражение, так что теперь у вас могут быть две проблемы.)

var list = new List<string>() 
{ 
    "Item 1: #item1#", 
    "Item 2: #item2#", 
    "Item 3: #item3#", 
    "Item 4: #item4#", 
    "Item 5: #item5#", 
}; 

var pattern = @"#[A-za-z0-9]*#"; 

list.Select (x => Regex.Match (x, pattern)) 
    .Where (x => x.Success) 
    .Select (x => x.Value) 
    .ToList() 
    .ForEach (Console.WriteLine); 

Выход:

# элемент1 #

# элемент2 #

# элемент3 #

# item4 #

# Item5 #

Смежные вопросы