我正在实现一个功能,即检查一个(可能很长的)被禁词/短语列表的模糊(例如消息/论坛帖子等),如果任何一个或多个单词是,则返回true在blurb中找到,如果没有,则为false。
这是在vbScript中完成的。
旧开发人员目前使用instr()进行非常大的IF语句,例如
If instr(ucase(contactname), "KORS") > 0 OR _
instr(ucase(contactname), "D&G") > 0 OR _
instr(ucase(contactname), "DOLCE") > 0 OR _
instr(ucase(contactname), "GABBANA") > 0 OR _
instr(ucase(contactname), "TIFFANY") > 0 OR _
'...
Then
我正在尝试在两个解决方案之间做出决定来替换上面的代码:
"KORS|D&G|DOLCE|GABBANA|TIFFANY"
等等,我们会进行正则表达式测试以返回true,如果有的话或者找到了更多的单词。在我看来,正则表达式选项是最好的,因为它是一个"检查"例如模糊测试模式。但我想知道潜在的非常长的正则表达式模式是否会增加足够的处理开销来否定执行“#”检查的简单性和好处。与许多"检查"在数组循环场景中?
我也愿意接受我可能忽略的其他选择。
提前致谢。
编辑 - 澄清一下,这是针对一个"模糊"的单一测试。例如反对被禁止的单词列表的评论,论坛帖子等。它只在Web请求期间运行一次。基准测试应该测试单词列表的大小而不是用例的执行次数。
答案 0 :(得分:2)
对我来说(没有检查)这样复杂的正则表达式会更慢,并且还会评估这样复杂的“或”。声明会变慢(VBS将评估所有替代方案)
是否应评估所有替代方案以了解表达价值 - 当然不是
我要做的是用一个禁止的单词填充一个数组,然后遍历它,检查单词是否在被搜索的文本中 - 如果发现单词中断迭代。
你可以存储最受欢迎的'数组顶部的禁止词(某种等级),所以你最有可能在几个步骤中找到它们。
使用数组的另一个好处是更容易管理它的数据。与“硬编码”相比较的价值观' if
语句中的值。
我刚刚用regexp(" word | anotherword")和InStr测试了每个单词的1 000 000次检查,看起来我不对。 正则表达式检查花费了13秒,而InStr则为71秒 编辑:用regexp分别检查每个单词需要78秒 我仍然认为,如果你有许多被禁止的单词一个接一个地检查它们并且如果发现任何一个被破坏会更快(在最后检查之后我会考虑加入它们(5?10?)并且每次检查不是这样复杂的正则表达式)。
答案 1 :(得分:2)
您可以创建一个包含所有单词的字符串。用分隔符围绕每个单词。
Const TEST_WORDS = "|KORS|D&G|DOLCE|GABBANA|TIFFANY|"
然后,测试一下你的单词(加上分隔符)是否包含在这个字符串中:
If InStr(1, TEST_WORDS, "|" & contactname & "|", vbTextCompare) > 0 Then
' Found word
End If
不需要数组循环或正则表达式。