复合条件: 例如:(小小明 Or 小明) And (小强 Or 小小强) 例如:(小小明 Or 小名) And 小小强 例如: ROOT1 And (广东人 Or 北京人) -----------------------------------------------------------
复制代码 代码如下:
Class CreateQueryString
Public objReg Public intStart Public strField Private objNode2 Private strText
Public Property Let QueryString( strValue ) strText = Lcase( strValue ) End Property
Private Sub Class_Initialize() Set objReg = new RegExp strField = "(标题+文章)" End Sub
Private Sub Class_Terminate() Set objReg = Nothing End Sub
Public Default Function GetText() Dim blnRes Dim strSky With objReg .IgnoreCase = true .Global = True .Pattern = "\s" blnRes = .Test( strText ) End With If (Not blnRes) Then intStart = 2 GetText = strField " like '%" strText "%'" Else objReg.Pattern = "\sand|\sor" blnRes = objReg.Test( strText ) If blnRes Then strSky = check() If strSky = False Then GetText = wahaha() Else GetText = strSky End if Else GetText = wahaha() End if End If End Function
Private Function wahaha() Dim strTer Dim strLikes Dim strOrs Dim strI Dim objRe strTer = "" strLikes = " or (" strField " like '%" strOrs = "%')" objReg.Pattern = "(\S*\S)" Set objRe = objReg.Execute(strText) For Each strI In objRe strTer = strTer strLikes strI strOrs Next wahaha = Mid( strTer , 4 ) intStart = 3 End Function
Private Function CheckYes( strMode , intCount) Dim objNode1 objReg.Pattern = strMode Set objNode1 = objReg.Execute( strText ) If objNode1.Count 1 Then CheckYes = True Else Set objNode2 = objNode1( 0 ) If objNode2.subMatches.Count intCount Then CheckYes = True End If End If End Function
Private Function ORAND() Dim strSSS Dim strCCC Dim strAAA Dim a143 Dim i Dim objN Dim blnTru Dim blnBBB strSSS = "(" strField " like '%" strCCC = "%')" strAAA = "" n1 = 0 blnTru = True blnBBB = True
objReg.Pattern = "(\S*\S)" Set objN = objReg.Execute( strText ) a143 = objN.Count - 1 If (objN.Item( a143 ) = "and") Or (objN.Item( a143 ) = "or") Then ORAND = False Exit Function End if For Each i In objN If blnTru Then If (i > "and") And (i > "or") Then blnTru = False strAAA = strAAA strSSS i strCCC Else blnBBB = false Exit for End if Else If (i = "and") Or (i = "or") Then blnTru = True strAAA = strAAA i Else blnBBB = False Exit For End if End if Next If (Not blnBBB) Then ORAND = False Else ORAND = strAAA intStart = 4 End if End Function
Private Function check() Dim re Dim re1 Dim re2 Dim re3 Dim str Dim str1 Dim a1 Dim a2 Dim a3 Dim a4 str = strField " like '%" str1 = "%'" With objReg .Pattern = "^\(.+\)\s(and|or)\s" re = .Test( strText ) .Pattern = "\s(and|or)\s\(.+\)$" re3 = .Test( strText ) End With If re And re3 Then If CheckYes( "^\((\S*\S) (\bor\b|\band\b) (\S*\S)\) (and|or) \((\S*\S) (\bor\b|\band\b) (\S*\S)\)$" , 6 ) Then check = False Else With objNode2 a1 = .submatches(0) a2 = .submatches(2) a3 = .submatches(4) a4 = .submatches(6) check = "(" str a1 str1 " " .submatches(1) " " str a2 str1 ") " _ .submatches(3) " (" str a3 str1 " " .submatches(5) " " str a4 str1 ")" intStart = 5 End With End If ElseIf re Then If CheckYes( "^\((\S*\S) (\bor\b|\band\b) (\S*\S)\) (and|or) (.+)" , 4 ) Then check = False Else With objNode2 a1 = .submatches(0) a2 = .submatches(2) a3 = .submatches(4) check = "(" str a1 str1 " " .submatches(1) " " str a2 str1 ") " _ .submatches(3) " (" str a3 str1 ")" intStart = 5 End With End If ElseIf re3 Then If CheckYes( "(.+) (and|or) \((\S*\S) (\bor\b|\band\b) (\S*\S)\)$" , 4 ) Then check = False Else With objNode2 a1 = .submatches(0) a2 = .submatches(2) a3 = .submatches(4) check = "(" str a1 str1 ") " .submatches(1) " (" str a2 str1 " " _ .submatches(3) " " str a3 str1 ")" intStart = 5 End With End If Else check = ORAND() End If End Function
End Class
-------------------------注意----------------------------- 替换好的字符串并不是完整的SQL语句.只是生成SQL语句的WHERE关键字后面的表达式.发送到ASP程序的时候.你可以在前面加上 "select id,标题,name,TableName from SearchAll where " 这样类似的SQL语句 -------------------------VBScript例子----------------------------- Dim objROOT1 Set objROOT1 = new CreateQueryString objROOT1.QueryString = strText '====传入要替换的字符串 objROOT1.strField = "要查询的字段名字" '===如果不设置.默认值是"(标题+文章)" strText = objROOT1() '=========得到替换好的SQL语句 If (objQueryString.intStart = 4) Then Call Msgbox("启动按逻辑搜索") End If Set objROOT1 = Nothing