目标
要搜索文本文件中的一堆行,如果找到匹配项,则在HTA中显示的“选项”列表中填充该行。 例如:如果在总共10行中的5行中找到“设置”,则所有5行都需要填充为“选项”
代码
Set objFSO = CreateObject("Scripting.Filesystemobject")
Set objRegEx = New RegExp
With objRegEx
.Pattern = "(\b" & "setup" & "\b)"
.IgnoreCase = True
.Global = True
End With
Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
Contents = objOpen.ReadAll
Set objMatchAll = objRegEx.Execute( Contents )
If objMatchAll.count > 0 Then
Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
Do Until objOpen.AtEndOfStream
Line = objOpen.ReadLine
Set objMatchAny = objRegEx.Execute( Line )
If objMatchAny.count > 0 Then
Set objOption = Document.createElement("OPTION")
objOption.Text = Line
objOption.Value = Line
ValuesList.add objOption
'Matched = Matched & vbNewLine & Line
MatchCount = MatchCount + 1
End If
Loop
Else
MsgBox "No results"
End If
解释
代码在文件'FileList.lst'中查找术语'setup'(当然这是在执行时动态填充)。找到结果时,会生成一个“选项”对象,并将其添加到使用标记的HTML正文中的“ValuesList”列表中。
注1:我生成'Options'对象而不是仅加载该行的原因是我们可以填充标记。使用标签,以便我们可以选择任何一个搜索结果。
注2:创建'Contents'变量的原因是,如果根本没有匹配,则不需要去每一行找到匹配,这只需要更长的时间来显示该消息。
问题
代码工作正常,测试最多150个结果(结果),但是当有大量匹配时我的HTA会冻结。
问题
更新
好吧,我运行我的脚本没有objOption部分,它没有创建和添加选项到我的ValuesList,只有regexp解析通过58k行,也导致58k匹配,结果是3secs ...所以看起来我需要一个替代填充我的HTA选项列表...它无法处理那么多选项来选择......任何替代方案?我在浏览器中使用了相同的逻辑,整个浏览器都冻结了......
答案 0 :(得分:2)
看起来你真的只关心正则表达式是否与特定行匹配。由于您不需要知道发生了多少匹配,也不需要实际匹配文本,因此您可以使用Test
方法。这应该更快,因为它将在第一次匹配后停止,而且它不必构建Matches
集合。出于几乎相同的原因,我还将Global
属性保留为默认值False
,但如果您只是使用Test
方法,我认为不会Global
财产很重要。
答案 1 :(得分:1)
感谢Cheran Shunmugavel我发现最好的方法是使用DocumentFragments。我在我的代码中实现了这个概念,结果很棒!
新代码
Set objFSO = CreateObject("Scripting.Filesystemobject")
Set objRegEx = New RegExp
With objRegEx
.Pattern = "(\b" & "setup" & "\b)"
.IgnoreCase = True
.Global = True
End With
Set objFragment = Document.createDocumentFragment()
Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
Contents = objOpen.ReadAll
Set objMatchAll = objRegEx.Execute( Contents )
If objMatchAll.count > 0 Then
Set objOpen = objFSO.OpenTextFile ("FileList.lst", 1)
Do Until objOpen.AtEndOfStream
Line = objOpen.ReadLine
Set objMatchAny = objRegEx.Execute( Line )
If objMatchAny.count > 0 Then
Set objOption = Document.createElement("OPTION")
objOption.innerHTML = Line
objFragment.appendchild objOption
MatchCount = MatchCount + 1
End If
Loop
ViewList.appendChild objFragment.cloneNode(True)
Else
MsgBox "No results"
End If
旧代码:53分钟23秒
新密码:31秒