首页 > 解决方案 > 搜索名称包含特定数字的文件

问题描述

我有数千个包含各种目录的文件。所有文件名都包含 (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) !

标签: c#search

解决方案


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

最大的想法是我引入了正则表达式来避免单词被十进制字符包围的命中。

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

推荐阅读