搜索名称中包含特定编号的文件

时间:2019-04-17 22:24:10

标签: c# search

我有成千上万个带有不同目录的文件。所有包含数字的文件名,例如(abc 2354,nfg 8239 sdf,abc 23,qwe 23)等。 我想搜索名称仅包含(23)个文件。

我尝试了许多搜索模式,但结果都是一样的。这是我的代码:

var files = Directory.EnumerateFiles(pathh, "*.doc", SearchOption.AllDirectories).Where(p => p.Contains(searchword));
            foreach (string file in files)
            {
                if (File.Exists(file))
                {
                    listBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
                }
            }

因此结果必须仅是(abc 23,qwe 23),但返回的所有名称都包含23,例如(abc 2354,nfg 8239 sdf,abc 23,qwe 23)!!

1 个答案:

答案 0 :(得分:2)

您可能想尝试一个更简单,更完整的示例。下面我将输出到控制台,但是您可以轻松地将其更改回适合您的需求。

一个大想法是,我引入Regex来避免单词被小数字符包围的匹配。

var path = @"some path here";
var searchWord = "23";

var regex = new Regex($@"[^0-9]{searchWord}[^0-9]");

var files = 
    Directory.EnumerateFiles(path, "*.doc", SearchOption.AllDirectories)
    .Where(p => regex.Match(p).Success);

foreach (string file in files) {
    if (File.Exists(file)) {
        Console.WriteLine(Path.GetFileNameWithoutExtension(file));
    }
}   

这假设有一点宽松的要求。数字23不能掩埋在更大的数字内。如果您确实不希望其他数字出现在路径中的任何位置,请尝试以下正则表达式:

var regex = new Regex($@"^[^0-9]*{searchWord}[^0-9]+$");

如果要在文件级别而不是在路径级别使用此限制,请将linq where语句更改为以下内容:

.Where(p => regex.Match(Path.GetFileNameWithoutExtension(p)).Success);