_ArrayPatternMatch - Ein Array mittels Wildcard filtern

  • Hallo!

    Hab mal wieder kurz Zeit gehabt und mir diese nützliche Funktion geschrieben mit der man ein Array mittels Wildcards filtern kann.
    Ich hoffe, das kann mal jemand brauchen!

    Spoiler anzeigen
    [autoit]

    #Include <Array.au3>

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

    Local $aTest
    Local $aArray[5] = ["abcde", "aabcd", "bcd", "aeiou", "asdf"]
    Local $aPattern[6] = ["*e", "aa*", "?cd", "*e*", "*d", "*d?"]

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

    _ArrayDisplay($aArray, "Original Array")

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

    For $i = 0 To UBound($aPattern) - 1
    $aTest = _ArrayPatternMatch($aArray, $aPattern[$i])
    _ArrayDisplay($aTest, "Filter: " & $aPattern[$i])
    Next

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

    Func _ArrayPatternMatch($aArray, $sPattern)
    ;funkey May 17, 2010
    If UBound($aArray, 0) <> 1 Then Return SetError(1, 0, "") ;no 1D-array
    Local $n = UBound($aArray)
    Local $aRes[$n], $j = 0
    $sPattern = "^\Q" & $sPattern & "\E$"
    $sPattern = StringReplace($sPattern, "?", "\E.\Q")
    $sPattern = StringReplace($sPattern, "*", "\E.*\Q")
    For $i = 0 To $n - 1
    If StringRegExp($aArray[$i], $sPattern, 0) Then
    $aRes[$j] = $aArray[$i]
    $j += 1
    EndIf
    Next
    If $j = 0 Then Return SetError(2, 0, "") ;no match
    ReDim $aRes[$j]
    Return $aRes
    EndFunc

    [/autoit]
  • Nur eine kleine Anmerkung: Wenn ich das richtig im Kopf habe, bedeutet ? nicht ein unbekanntes Zeichen, sondern 0 oder 1 unbekanntes Zeichen.
    Sollte also durch .? statt nur durch . ersetzt werden.

    Zitat

    Wildcards: In general, * denotes zero or more characters, and ? denotes zero or one character