实际场景中有这样一个需求,判断某个对象的某个属性,如果它的字符串值中包含某些特定的字符串,那么要进行开始过程A,否则开始过程B。
最简单的实现是
vbnet
if InStr(obj.title,".大师")<>0 or InStr(obj.title,".统领")<>0 or InStr(obj.title,".丞相")<>0 or InStr(obj.title,".元帅")<>0 or InStr(obj.title,".将军")<>0 then
逻辑是对的,不过每多一个匹配条件,在语句中要加一个or项,用于防御性编程是OK的,一般情况是不推荐这样写的,改成下面这样怎样呢
vbnet
Function isleader(title)
leaderstrs=array(".大师.",".统领",".丞相",".元帅",".将军")
match=False
for each item in leaderstrs
if inStr(title,item) then
match=True
Exit For
end if
next
isleader=match
End Function
这样会好一些,主程序里调用即可
vbnet
if isleader(obj.title) then
不过这样用字符串数组匹配还不够优化,可以考虑用正则表达式匹配
vbnet
Dim re
Set re = New RegExp
re.Pattern = "\.大师|\.统领|\.丞相|\.元帅|\.将军"
re.IgnoreCase = False
后面检查判断用:
vbnet
if re.test(obj.title) then
数据放在代码里还是不好,把匹配值移到同文件夹下的配置文件params.js中
vbnet
leader = {"title":"\.大师|\.统领|\.丞相|\.元帅|\.将军"}
程序先加载配置文件
vbnet
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("params.js", ForReading)
strResponses = objTextFile.ReadAll
objTextFile.Close
Set html = CreateObject("htmlfile")
Set window = html.parentWindow
window.execScript strResponses, "JScript" ' 解析 js
Set jsleader = window.leader ' 获取解析后的对象
Dim re
Set re = New RegExp
re.Pattern = jsleader.title
re.IgnoreCase = False
嗯,这下似乎可以满意了,虽然代码看起来多了一些,不过配置参数和功能逻辑分离是一个好的编程习惯。