How do I check if a filename matches a wildcard pattern

前端 未结 8 1534
青春惊慌失措
青春惊慌失措 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 06:58

    Some kind of regex/glob is the way to go, but there are some subtleties; your question indicates you want identical semantics to IO.DirectoryInfo.GetFiles. That could be a challenge, because of the special cases involving 8.3 vs. long file names and the like. The whole story is on MSDN.

    If you don't need an exact behavioral match, there are a couple of good SO questions:

    glob pattern matching in .NET
    How to implement glob in C#

    0 讨论(0)
  • 2020-11-30 07:01

    The use of RegexOptions.IgnoreCase will fix it.

    public class WildcardPattern : Regex {
        public WildcardPattern(string wildCardPattern)
            : base(ConvertPatternToRegex(wildCardPattern), RegexOptions.IgnoreCase) {
        }
    
        public WildcardPattern(string wildcardPattern, RegexOptions regexOptions)
            : base(ConvertPatternToRegex(wildcardPattern), regexOptions) {
        }
    
        private static string ConvertPatternToRegex(string wildcardPattern) {
            string patternWithWildcards = Regex.Escape(wildcardPattern).Replace("\\*", ".*");
            patternWithWildcards = string.Concat("^", patternWithWildcards.Replace("\\?", "."), "$");
            return patternWithWildcards;
        }
    }
    
    0 讨论(0)
  • 2020-11-30 07:02

    You could translate the wildcards into a regular expression:

    *.txt -> ^.+\.txt$
    
    POS??.dat _> ^POS..\.dat$
    

    Use the Regex.Escape method to escape the characters that are not wildcars into literal strings for the pattern (e.g. converting ".txt" to "\.txt").

    The wildcard * translates into .+, and ? translates into .

    Put ^ at the beginning of the pattern to match the beginning of the string, and $ at the end to match the end of the string.

    Now you can use the Regex.IsMatch method to check if a file name matches the pattern.

    0 讨论(0)
  • 2020-11-30 07:03

    You can simply do this. You do not need regular expressions.

    using Microsoft.VisualBasic.CompilerServices;
    
    if (Operators.LikeString("pos123.txt", "pos?23.*", CompareMethod.Text))
    {
      Console.WriteLine("Filename matches pattern");
    }
    

    Or, in VB.Net,

    If "pos123.txt" Like "pos?23.*" Then
      Console.WriteLine("Filename matches pattern")
    End If
    

    In c# you could simulate this with an extension method. It wouldn't be exactly like VB Like, but it would be like...very cool.

    0 讨论(0)
  • 2020-11-30 07:06

    For anyone who comes across this question now that it is years later, I found over at the MSDN social boards that the GetFiles() method will accept * and ? wildcard characters in the searchPattern parameter. (At least in .Net 3.5, 4.0, and 4.5)

    Directory.GetFiles(string path, string searchPattern)
    

    http://msdn.microsoft.com/en-us/library/wz42302f.aspx

    0 讨论(0)
  • 2020-11-30 07:08

    Plz try the below code.

    static void Main(string[] args)
        {
            string _wildCardPattern = "*.txt";
    
            List<string> _fileNames = new List<string>();
            _fileNames.Add("text_file.txt");
            _fileNames.Add("csv_file.csv");
    
            Console.WriteLine("\nFilenames that matches [{0}] pattern are : ", _wildCardPattern);
            foreach (string _fileName in _fileNames)
            {
                CustomWildCardPattern _patetrn = new CustomWildCardPattern(_wildCardPattern);
                if (_patetrn.IsMatch(_fileName))
                {
                    Console.WriteLine("{0}", _fileName);
                }
            }
    
        }
    
    public class CustomWildCardPattern : Regex
    {
        public CustomWildCardPattern(string wildCardPattern)
            : base(WildcardPatternToRegex(wildCardPattern))
        {
        }
    
        public CustomWildCardPattern(string wildcardPattern, RegexOptions regexOptions)
            : base(WildcardPatternToRegex(wildcardPattern), regexOptions)
        {
        }
    
        private static string WildcardPatternToRegex(string wildcardPattern)
        {
            string patternWithWildcards = "^" + Regex.Escape(wildcardPattern).Replace("\\*", ".*");
            patternWithWildcards = patternWithWildcards.Replace("\\?", ".") + "$";
            return patternWithWildcards;
        }
    }
    
    0 讨论(0)
提交回复
热议问题