2013-02-14 7 views
5

Ich habe eine Liste von Zeichenketten wie folgt aus:C# Lassen Sie sich mit spezifischen Muster von String substring

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

Wie kann ich und fügen Sie die Teil # item1 # # # item2 etc in eine neue Liste?

Ich bin nur in der Lage, die komplette Zeichenfolge zu erhalten, wenn es einen „#“ enthält, indem dies zu tun:

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

etwas mit diesen Funktionen: substring (FirstIndexOf ('#'), LastIndexOf ('#')); – Karl

+1

Was soll zurückgegeben werden, wenn die Zeichenfolge nicht den Teil '# item #' enthält? –

Antwort

8

Sie einen Blick auf Regex.Match haben könnte. Wenn Sie ein wenig über reguläre Ausdrücke wissen (in Ihrem Fall wäre es ein einfaches Muster: "#[^#]+#"), können Sie damit alle Objekte beginnend mit '#' mit einer beliebigen Anzahl anderer Zeichen als '#' dazwischen extrahieren.

Beispiel:

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

Wie wäre es damit:

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

Sie könnten das tun, indem Sie einfach mit:

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

dies versuchen.

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


} 
1

LINQ wäre schön die Arbeit machen:

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

Oder wenn Sie Abfrageausdrücke bevorzugen:

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

Alternativ können Sie reguläre Ausdrücke verwenden, wie mit Botz3000 vorgeschlagen und kombinieren die mit LINQ:

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

Der Code löst Ihr Problem. Aber wenn die Zeichenfolge #item# nicht enthält, wird die ursprüngliche Zeichenfolge verwendet.

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

Hier ist ein anderer Weg mit einem Regex mit LINQ. (Nicht sicher, ob Ihre genauen Anforderungen auf die Regex verweisen, also haben Sie möglicherweise zwei Probleme.

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

Output:

# item1 #

# Element2 #

# item3 #

# item4 #

# item5 #

Verwandte Themen