Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用通配符搜索文件名列表_C#_File - Fatal编程技术网

C# 使用通配符搜索文件名列表

C# 使用通配符搜索文件名列表,c#,file,C#,File,我有一个文件名列表和一个DOS样式的通配符作为搜索参数 List<string> filenames = FileNames; 列出文件名=文件名; 如何仅接收与通配符匹配的文件(“p*.doc”、“w*.doc”、“r.doc”等) 是的,我知道Directory.GetFiles,但我没有目录。只有文件名。您可以根据DOS样式的通配符文件名规范创建一个正则表达式,然后从列表中选择与正则表达式匹配的文件名,如: using System; using System.Collec

我有一个文件名列表和一个DOS样式的通配符作为搜索参数

List<string> filenames = FileNames;
列出文件名=文件名;
如何仅接收与通配符匹配的文件(“p*.doc”、“w*.doc”、“r.doc”等)


是的,我知道Directory.GetFiles,但我没有目录。只有文件名。

您可以根据DOS样式的通配符文件名规范创建一个正则表达式,然后从列表中选择与正则表达式匹配的文件名,如:

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

        }
    }
}
  • 在正则表达式中,
    是一个特殊字符,表示“任何字符”,因此需要将其转义为
    \。
  • 在DOS通配符中,
    *
    表示任何字符中的零个或多个,这是正则表达式中的
    *?
    使其成为“非贪婪的”)
  • 在DOS通配符中,
    表示一个字符,即正则表达式中的
  • 如果存在其他特殊的正则表达式字符,则在必要时对其进行转义
  • ^
    $
    分别表示字符串的开始和结束,因此不会从文件名的中间获得不需要的匹配

您可以根据DOS样式的通配符文件名规范创建一个正则表达式,然后从列表中选择与正则表达式匹配的文件名,如:

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

        }
    }
}
  • 在正则表达式中,
    是一个特殊字符,表示“任何字符”,因此需要将其转义为
    \。
  • 在DOS通配符中,
    *
    表示任何字符中的零个或多个,这是正则表达式中的
    *?
    使其成为“非贪婪的”)
  • 在DOS通配符中,
    表示一个字符,即正则表达式中的
  • 如果存在其他特殊的正则表达式字符,则在必要时对其进行转义
  • ^
    $
    分别表示字符串的开始和结束,因此不会从文件名的中间获得不需要的匹配
    • 最简单的方法:

      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));
      
      使用Microsoft.VisualBasic.CompilerServices;
      ...
      var filenames=newlist(){“b.pdf”、“al.rtf”、“mel.doc”};
      var matched=文件名。其中(f=>LikeOperator.LikeString(f,“*.d*”,CompareMethod.Text));
      
      最简单的方法:

      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));
      
      使用Microsoft.VisualBasic.CompilerServices;
      ...
      var filenames=newlist(){“b.pdf”、“al.rtf”、“mel.doc”};
      var matched=文件名。其中(f=>LikeOperator.LikeString(f,“*.d*”,CompareMethod.Text));
      
      使用此模式=新的通配符模式(patternString);模式IsMatch(stringToMatch);使用此模式=新的通配符模式(patternString);模式IsMatch(stringToMatch);它确实紧凑且简单,但请注意,has注释“此helper方法并不意味着直接从代码中调用”。它确实紧凑且简单,但请注意has注释“此helper方法不意味着直接从代码中调用”