_StringMatch - Strings logisch durchsuchen

  • Mit dieser Funktions lassen sich Patterns in String suchen, die boolsche Operatoren enthalten können. Die Funktion gibt zurück, ob der Input zum Pattern passt oder nicht. Ein Beispiel ist dabei:

    [autoit]

    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    $sInput = 'Ashley R., Harris and Maxwell are going to the lake.'

    [/autoit][autoit][/autoit][autoit]

    $sQuery = '((Ashley and R.) and (lake and not mountain)) and Harris and "and Maxwell"'
    ; -> There is a Person named Ashley
    ; -> Ashleys surname is R.
    ; -> There is a lake, but no mountain
    ; -> There is a Person named Harris
    ; -> Maxwell should be the last person mentioned in this sentence

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite("-> " & _StringMatch($sQuery, $sInput) & @LF)

    [/autoit][autoit][/autoit][autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringMatch
    ; Description ...: Returns wether the search pattern matches the given string.
    ; Boolean Operators, Brackets and Quotes can be used:
    ; Available OPs: and or not xor
    ; Brackets and even nested Brackets can be used (causes recursion).
    ; Use quotes to search for strings containing spaces
    ; Syntax ........: _StringMatch($sSearch, $sString)
    ; Parameters ....: $sSearch - The search pattern.
    ; $sString - A string value.
    ; Return values .: true or false
    ; Author ........: minx
    ; Example .......: s. above
    ; ===============================================================================================================================
    Func _StringMatch($sSearch, $sString)
    If $sSearch = "" Then Return SetError(1)
    Local $j[1], $b = 1
    $s = _StringInStrRev($sSearch, "(")
    While 1
    If $s > 0 Then
    $f = StringInStr($sSearch, ")", 0, 1, $s)
    If $f > 0 Then $sSearch = StringMid($sSearch, 1, $s - 1) & _StringMatch(StringMid($sSearch, $s + 1, $f - $s - 1), $sString) & StringMid($sSearch, $f + 1)
    EndIf
    $s = _StringInStrRev($sSearch, "(")
    If Not ($s > 0 And $f > 0) Then ExitLoop
    WEnd
    $i = StringSplit($sSearch, " ", 3)
    If StringInStr($sSearch, """", 0, 1, 1) Then
    For $a = UBound($i)-1 To 0 Step -1
    If StringRight($i[$a], 1) = """" And StringLeft($i[$a], 1) <> """" Then
    $i[$a - 1] &= " " & $i[$a]
    $i[$a] = ""
    EndIf
    If StringRight($i[$a], 1) = """" And StringLeft($i[$a], 1) = """" And StringLen($i[$a]) > 1 Then $i[$a] = "!" & StringMid($i[$a], 2, StringLen($i[$a]) - 2)
    Next
    For $a = 0 To UBound($i)-1
    If $i[$a] <> "" Then
    ReDim $j[$b]
    $j[$b - 1] = $i[$a]
    $b += 1
    EndIf
    Next
    $i = $j
    EndIf
    For $a = 0 To UBound($i)-1
    Switch StringUpper($i[$a])
    Case "AND"
    $i[$a] = "AND"
    Case "OR"
    $i[$a] = "OR"
    Case "NOT"
    $i[$a] = "NOT"
    Case "XOR"
    $i[$a] = "XOR"
    Case "TRUE"
    $i[$a] = "true"
    Case "FALSE"
    $i[$a] = "false"
    Case Else
    If StringLeft($i[$a], 1) = "!" Then $i[$a] = StringMid($i[$a], 2)
    $i[$a] = StringLower(StringInStr($sString, $i[$a], 0, 1, 1) <> 0)
    EndSwitch
    Next
    $sSearch = _ArrayToString($i, " ")
    While 1
    If StringInStr($sSearch, "NOT", 0, 1, 1) <> 0 Then
    $sSearch = StringReplace($sSearch, "NOT false", "true")
    $sSearch = StringReplace($sSearch, "NOT true", "false")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If StringInStr($sSearch, "OR", 0, 1, 1) <> 0 Then
    $sSearch = StringReplace($sSearch, "false OR false", "false")
    $sSearch = StringReplace($sSearch, "true OR false", "true")
    $sSearch = StringReplace($sSearch, "false OR true", "true")
    $sSearch = StringReplace($sSearch, "true OR true", "true")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If StringInStr($sSearch, "XOR", 0, 1, 1) <> 0 Then
    $sSearch = StringReplace($sSearch, "false XOR false", "false")
    $sSearch = StringReplace($sSearch, "true XOR false", "true")
    $sSearch = StringReplace($sSearch, "false XOR true", "true")
    $sSearch = StringReplace($sSearch, "true XOR true", "false")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If StringInStr($sSearch, "AND", 0, 1, 1) <> "0" Then
    $sSearch = StringReplace($sSearch, "false AND false", "false")
    $sSearch = StringReplace($sSearch, "true AND false", "false")
    $sSearch = StringReplace($sSearch, "false AND true", "false")
    $sSearch = StringReplace($sSearch, "true AND true", "true")
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If StringInStr($sSearch, " ", 0, 1, 1) Then
    $sSearch = StringReplace($sSearch, "true true", "true")
    $sSearch = StringReplace($sSearch, "false true", "true")
    $sSearch = StringReplace($sSearch, "true false", "true")
    $sSearch = StringReplace($sSearch, "false false", "false")
    If StringInStr($sSearch, " ", 0, 1, 1) Then
    $sSearch &= " false"
    ContinueLoop
    EndIf
    EndIf
    ExitLoop
    WEnd
    Return $sSearch
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func _StringInStrRev($sString, $sSearch)
    $iPtr = StringLen($sSearch)
    For $nPos = StringLen($sString) - $iPtr To 1 Step -1
    If StringMid($sString, $nPos, $iPtr) = $sSearch Then Return $nPos
    Next
    Return 0
    EndFunc

    [/autoit]
  • Interessante Funktion minx - sollte von Nutzen sein, wenn man Strings logisch durchsuchen möchte. :thumbup:

    Danke für's Teilen.


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯