2011-08-10 11 views
11

से मेल खाने वाले स्ट्रिंग्स की सूची को फ़िल्टर करने के लिए कैसे करें मेरे पास तारों की एक सूची है (वास्तव में फ़ाइल नाम) और मैं केवल उन लोगों को रखना चाहता हूं जो फ़िल्टर अभिव्यक्ति से मेल खाते हैं जैसे: \*_Test.txtपैटर्न

इसे प्राप्त करने के लिए सबसे अच्छा क्या होगा?

यहाँ जवाब है कि मैं के साथ आया है:

List<string> resultList = files.Where(x => x.EndsWith("_Test.txt")).ToList(); 

या आप कुछ पुराने/विरासत नेट संस्करण पर इस चला रहे हैं (:

List<string> files = new List<string>(); 
files.Add("MyFile1.csv"); 
files.Add("MyFile1_Test.txt"); 
files.Add("MyFile2.csv"); 
files.Add("MyFile2_Test.txt"); 
files.Add("MyFile3.csv"); 
files.Add("MyFile3_Test.txt"); 
files.Add("MyFile_Testtxttxt.txt"); 

// Define a filter 
string filter = "*_Test.txt"; 

// Make the filter regex safe 
foreach (char x in @"\+?|{[()^$.#") 
    filter = filter.Replace(x.ToString(), @"\" + x.ToString()); 

filter = string.Format("^{0}$",filter.Replace("*", ".*")); 

// Old School 
List<string> resultList1 = files.FindAll(delegate(string s) { return Regex.IsMatch(s, filter, RegexOptions.IgnoreCase); }); 

// Version using LINQ 
List<string> resultList2 = files.Where(x => Regex.IsMatch(x, filter, RegexOptions.IgnoreCase) == true).ToList(); 
+0

मैं फिल्टर करना चाहते हैं तो मैं इस्तेमाल कर सकते हैं \ * \ * या लचीला होना \ * .t \ * या संयोजनों की संख्या । \ * को हटाने से मुझे आंशिक मिलान नहीं मिलेंगे। – TeamWild

+0

ईप, मेरे उत्तर में एक सुधार आपको स्ट्रिंग को बदलने की जरूरत है। '("^ {0} $") के लिए फॉर्मेट करें अन्यथा इसे "fish_Test.txtWIBBLE" ' –

उत्तर

18

शायद आप वान इसके लिए नियमित अभिव्यक्ति का उपयोग करने के लिए यदि आपके पैटर्न जटिल होने जा रहे हैं ....

आप या तो अपने फ़िल्टर के रूप में उचित नियमित अभिव्यक्ति का उपयोग कर सकते हैं (उदाहरण के लिए आपके विशिष्ट उदाहरण के लिए यह new Regex(@"^.*_Test\.txt$") होगा या आप एक आवेदन कर सकते हैं रूपांतरण एल्गोरिदम।

किसी भी तरह से आप रेगेक्स को लागू करने के लिए बस linq का उपयोग कर सकते हैं।

उदाहरण

var myRegex=new Regex(@"^.*_Test\.txt$"); 
List<string> resultList=files.Where(myRegex.IsMatch).ToList(); 

कुछ लोगों को लगता है कि इसके बाद के संस्करण उत्तर गलत है, लेकिन आप एक लैम्ब्डा के बजाय एक विधि समूह उपयोग कर सकते हैं के लिए

। आप पूर्ण lamda चाहते हैं तो आप का प्रयोग करेंगे:

var myRegex=new Regex(@"^.*_Test\.txt$"); 
List<string> resultList=files.Where(f => myRegex.IsMatch(f)).ToList(); 

या गैर Linq

List<string> resultList=files.FindAll(delegate(string s) { return myRegex.IsMatch(s);}); 

अगर आप फिल्टर परिवर्तित किया गया एक सरल रूपांतरण होगा

var myFilter="*_Test.txt"; 
var myRegex=new Regex("^" + myFilter.Replace("*",".*") +"$"); 

फिर आप भी हो सकता था इस विधि के साथ "*Test*.txt" जैसे फ़िल्टर।

हालांकि, यदि आप इस रूपांतरण मार्ग को नीचे चलाते हैं तो आपको यह सुनिश्चित करना होगा कि आप सभी विशेष नियमित अभिव्यक्ति वर्णों से बच निकले हैं। "।" बन जाता है ""। "," ("बन जाता है" ("आदि .......

संपादित करें - उदाहरण प्रतिस्थापित करना आसान है क्योंकि यह परिवर्तित नहीं होता है। इसलिए यह "fish_Textxtxt" से बच जाएगा कम से कम .

तो

string myFilter="*_Test.txt"; 
foreach(char x in @"\+?|{[()^$.#") { 
    myFilter = myFilter.Replace(x.ToString(),@"\"+x.ToString()); 
} 
Regex myRegex=new Regex(string.Format("^{0}$",myFilter.Replace("*",".*"))); 
7

आप LINQ करने की कोशिश की है < 3.5):

List<string> resultList = files.FindAll(delegate(string s) { 
    return s.EndsWith("_Test.txt"); 
}); 
+0

मिलेगा और आप उसमें regex जोड़ सकते हैं, अगर आप कुछ और लचीला चाहते हैं, फिर भी जटिल हो सकता है। http://msdn.microsoft।com/en-us/library/ms228595% 28v = VS.100% 29.aspx – Johnny5

+0

मैं उम्मीद कर रहा था कि रेगेक्स का उपयोग किए बिना एक त्वरित तरीका होगा क्योंकि यह हमेशा सिरदर्द में समाप्त होता है। मैं LINQ का उपयोग कर सकता हूं इसलिए इसे आज़माएं और देखें कि क्या होता है। – TeamWild

1

यह मेरे लिए काम किया है और काफी सरल है:।

List<string> keys = new List<string>(); 
//populate your list 
var myregex = new Regex("^.+$"); 
List<string> matchlist = keys.Where(i=>myregex.IsMatch(i)).ToList(); 
संबंधित मुद्दे