我有成千上万个带有不同目录的文件。所有包含数字的文件名,例如(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)!!
答案 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);