搜索目录,其中搜索词仅包含文件名的一部分

时间:2019-08-18 20:21:22

标签: vb.net

仅部分文件名已知时如何在目录中查找所有文件。

我已经播放了从互联网下载的列表。某些文件名完整且易于使用

查找
getfiles(searchString) 

,但是其他文件名的开头或中间缺少单词。更麻烦的是,许多文件名包含相同的单词,但标题中单词的位置有所不同,其他文件名称中又添加了一个额外的单词,当使用通配符代替丢失的单词时,结果中会包含一个额外的单词

真是满口。

我需要能够将已知的文件名单词输入一个变量,就像将一个搜索词输入到File Explorer文件搜索实用程序中一样,并返回最匹配的内容。

我尝试使用

location.Getfile("*term0*term1*term3*.mp3") 

这将导致命中和错过结果。它可以包含不应包含的名称。通常,这会导致本应移动但没有移动的文件。我可以使用相同的搜索词(-*),并将其放入“文件资源管理器”搜索中,它仅返回正确的文件,突出显示匹配的单词和未突出显示的不匹配单词。

我已经尝试过正则表达式,如下所示: 文件是:

A Day with Phil Harris.mp3
A Dog for the Kids.mp3
A Fight in the Market.mp3
A Job with Rexall for Willie.mp3

For Each Itm in location.GetFiles()
    FoundMatch = Regex.IsMatch(itm.Name, "\b(?:Day|with|A)\b", 
        RegexOptions.IgnoreCase)
Next

这将返回所有4个文件,因为每个文件至少包含1个字。如果结果是最佳匹配,其中包括整个搜索字词,而忽略了次要匹配,则可以将每个匹配的结果都捕获在其中。

我还考虑了循环和递归搜索结果,以尝试将最终结果优化为仅单词匹配程度最高的文件名。我敢肯定这会奏效,但似乎比应做的工作还要多。 (对于计算机,不是我,一旦编写了代码)

我已经在网络上搜索了我的搜索词。在过去的24小时里,我学到了很多东西,但是我真正想得到的却不是。

有什么想法,建议,指示等可以使我朝正确的方向前进吗?他们将不胜感激。

1 个答案:

答案 0 :(得分:0)

耗时的部分是访问磁盘上的文件。为计算机计算字数是花生。您可以通过重复使用相同的已编译正则表达式来提高速度:

'Before the loop!
Regex regex = New Regex("\b(?:Day|with|A)\b",
    RegexOptions.Compiled Or RegexOptions.IgnoreCase)

然后在循环内

Dim matches = regex.Matches(itm.Name)

您可以使用包含最匹配文件名的列表

Dim found As New List(Of String)
Dim bestMatchCount As Integer = 0

Dim regex = New Regex("\b(?:Day|with|A)\b",
    RegexOptions.Compiled Or RegexOptions.IgnoreCase)
For Each Itm In location.GetFiles()
    Dim matches = regex.Matches(Itm.Name)
    If matches.Count > bestMatchCount Then
        found.Clear() ' Remove any previously added not so good matches
        bestMatchCount = matches.Count
    End If
    found.Add(Itm.Name)
Next