zoukankan      html  css  js  c++  java
  • 实现支持逻辑搜索/单词搜索/词组搜索+支持OR/AND关键字的VBS CLASS

    CLASS功能.替换传入的字符串成为SQL语句Where关键字后面的表达式:

    词语搜索 [例如: 小明]

    词组搜索
    词组里面每一个词都将被检索
    例如: 小强1 小名1 小强强 小小强

    逻辑搜索
    支持 And 和 Or 运算符.
    例如: 小明 And 小强 And 小小强

    复合条件:
    例如:(小小明 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 
  • 相关阅读:
    C# macro function via #define __FILE__ __LINE__ ___FUNCTION__ __DATE__ __TIME__
    3
    2月23号
    3月26
    impala故障
    2月3号日更
    HDFS某个节点的磁盘满了
    3月2
    mq集群
    3月3
  • 原文地址:https://www.cnblogs.com/MaxIE/p/925787.html
Copyright © 2011-2022 走看看