How do I check if a filename matches a wildcard pattern

前端 未结 8 1568
青春惊慌失措
青春惊慌失措 2020-11-30 06:16

I\'ve got a wildcard pattern, perhaps \"*.txt\" or \"POS??.dat\".

I also have list of filenames in memory that I need to compare to that pattern.

How would

8条回答
  •  再見小時候
    2020-11-30 07:21

    I have a complete answer in code for you that's 95% like FindFiles(string).

    The 5% that isn't there is the short names/long names behavior in the second note on the MSDN documentation for this function.

    If you would still like to get that behavior, you'll have to complete a computation of the short name of each string you have in the input array, and then add the long name to the collection of matches if either the long or short name matches the pattern.

    Here is the code:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    
    namespace FindFilesRegEx
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] names = { "hello.t", "HelLo.tx", "HeLLo.txt", "HeLLo.txtsjfhs", "HeLLo.tx.sdj", "hAlLo20984.txt" };
                string[] matches;
                matches = FindFilesEmulator("hello.tx", names);
                matches = FindFilesEmulator("H*o*.???", names);
                matches = FindFilesEmulator("hello.txt", names);
                matches = FindFilesEmulator("lskfjd30", names);
            }
    
            public string[] FindFilesEmulator(string pattern, string[] names)
            {
                List matches = new List();
                Regex regex = FindFilesPatternToRegex.Convert(pattern);
                foreach (string s in names)
                {
                    if (regex.IsMatch(s))
                    {
                        matches.Add(s);
                    }
                }
                return matches.ToArray();
            }
    
            internal static class FindFilesPatternToRegex
            {
                private static Regex HasQuestionMarkRegEx   = new Regex(@"\?", RegexOptions.Compiled);
                private static Regex IllegalCharactersRegex  = new Regex("[" + @"\/:<>|" + "\"]", RegexOptions.Compiled);
                private static Regex CatchExtentionRegex    = new Regex(@"^\s*.+\.([^\.]+)\s*$", RegexOptions.Compiled);
                private static string NonDotCharacters      = @"[^.]*";
                public static Regex Convert(string pattern)
                {
                    if (pattern == null)
                    {
                        throw new ArgumentNullException();
                    }
                    pattern = pattern.Trim();
                    if (pattern.Length == 0)
                    {
                        throw new ArgumentException("Pattern is empty.");
                    }
                    if(IllegalCharactersRegex.IsMatch(pattern))
                    {
                        throw new ArgumentException("Pattern contains illegal characters.");
                    }
                    bool hasExtension = CatchExtentionRegex.IsMatch(pattern);
                    bool matchExact = false;
                    if (HasQuestionMarkRegEx.IsMatch(pattern))
                    {
                        matchExact = true;
                    }
                    else if(hasExtension)
                    {
                        matchExact = CatchExtentionRegex.Match(pattern).Groups[1].Length != 3;
                    }
                    string regexString = Regex.Escape(pattern);
                    regexString = "^" + Regex.Replace(regexString, @"\\\*", ".*");
                    regexString = Regex.Replace(regexString, @"\\\?", ".");
                    if(!matchExact && hasExtension)
                    {
                        regexString += NonDotCharacters;
                    }
                    regexString += "$";
                    Regex regex = new Regex(regexString, RegexOptions.Compiled | RegexOptions.IgnoreCase);
                    return regex;
                }
            }
        }
    }
    

提交回复
热议问题