2013-02-14 23 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を見ている可能性があります。正規表現について少し知っていれば(あなたの場合、それは非常に単純なパターンである:"#[^#]+#")、それを使って開始し、'#'で終わるすべてのアイテムを抽出し、'#'以外の任意の数の文字を抽出することができます。

例:

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

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

をそれとも、クエリ式好む場合:

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


} 
0

:これはどのように

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); 
} 
1

LINQはうまく仕事をするだろうまた

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で正規表現を使用する別の方法です。 (正確な要件が正規表現を参照しているかどうかわからないので、今は2つの問題があるかもしれません。)

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

出力:

# ITEM1 #

# ITEM2 #

# ITEM3 #

# ITEM4これらの機能を持つ

# item5 #