मेरे पास खोज पैरामीटर के रूप में फ़ाइल नामों और एक डॉस-शैली वाइल्डकार्ड की एक सूची है।

List<string> filenames = FileNames;

मैं केवल वही फ़ाइलें कैसे प्राप्त कर सकता हूँ जो मेरे वाइल्डकार्ड ("p*.doc", "w*.*", "??r.doc?", इत्यादि) से मेल खाती हों?

हां, मुझे Directory.GetFiles के बारे में पता है, लेकिन मेरे पास कोई निर्देशिका नहीं है। केवल फ़ाइल नाम।

1
Alex Blokha 18 पद 2020, 15:22

2 जवाब

सबसे बढ़िया उत्तर

आप क्या कर सकते हैं डॉस-स्टाइल वाइल्डकार्ड फ़ाइल नाम विनिर्देश से रेगेक्स बनाते हैं, फिर आप रेगेक्स से मेल खाने वाली सूची से फ़ाइल नामों का चयन कर सकते हैं, जैसे कुछ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace ConsoleApp1
{
    class Program
    {
        static string DosWildcardToRegex(string dwc)
        {
            string s = "";
            foreach (char c in dwc)
            {
                if (c == '.') { s += @"\."; }
                else if (c == '*') { s += ".*?"; }
                else if (c == '?') { s += "."; }
                else s += Regex.Escape(c.ToString());
            }
            return "^" + s + "$";
        }

        static void Main(string[] args)
        {
            string userWildcardSpec = "p*.xls*";
            string reWildcard = DosWildcardToRegex(userWildcardSpec);

            Regex re = new Regex(reWildcard, RegexOptions.IgnoreCase);

            var sampleFilenames = new List<string>() { "a1.xls", "p2.txt", "p1.xls", "p234.xls", "p7.xlsx" };

            var matchedFilenames = sampleFilenames.Where(f => re.IsMatch(f));

            Console.WriteLine(string.Join("\r\n", matchedFilenames));
            Console.ReadLine();

        }
    }
}

कौन सा आउटपुट:

p1.xls
p234.xls
p7.xlsx
  • रेगेक्स में, एक . एक विशेष वर्ण है जिसका अर्थ है "कोई भी वर्ण", इसलिए इसे \. के रूप में बचाना होगा।
  • डॉस वाइल्डकार्ड में, * का अर्थ किसी भी वर्ण का शून्य या अधिक है, जो कि रेगेक्स में .*? है (? इसे "गैर-लालची" बनाता है)।
  • डॉस वाइल्डकार्ड में, ? का अर्थ है एक वर्ण, जो कि रेगेक्स में . है।
  • यदि कोई अन्य विशेष रेगेक्स चरित्र है, तो वे जहां आवश्यक हो वहां से बच निकले हैं।
  • ^ और $ का मतलब क्रमशः स्ट्रिंग का प्रारंभ और अंत है, इसलिए इसे फ़ाइल नाम के बीच से अवांछित मिलान नहीं मिलेगा।
0
Andrew Morton 18 पद 2020, 16:10

सबसे आसान तरीका:

using Microsoft.VisualBasic.CompilerServices;
...
var filenames = new List<string>() { "b.pdf", "al.rtf", "mel.doc"};
var matched = filenames.Where(f => LikeOperator.LikeString(f, "*.d*", CompareMethod.Text));
0
Alex Blokha 18 पद 2020, 20:29