仅部分文件名已知时如何在目录中查找所有文件。
我已经播放了从互联网下载的列表。某些文件名完整且易于使用
查找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小时里,我学到了很多东西,但是我真正想得到的却不是。
有什么想法,建议,指示等可以使我朝正确的方向前进吗?他们将不胜感激。
答案 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