2013-02-14 46 views
5

से विशिष्ट पैटर्न के साथ सबस्ट्रिंग हो जाओ मैं इस तरह तार की एक सूची है:सी # स्ट्रिंग

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

स्ट्रिंग में भाग '# आइटम #' नहीं है, तो वापस क्या करें? –

उत्तर

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

आउटपुट:

# ITEM1 #

# ITEM2 #

# ITEM3 #

# item4 +०१२३५२९५१६४६

# item5 #