RegExp - ArrayPattern

    • Offizieller Beitrag

    Hi,
    ich möchte meine automatisierte Variablendeklaration ausbauen und auch auf die Möglichkeit von Variablen inerhalb einer Arraydeklaration reagieren.
    Mögliche Strings z.B.:
    Local $IrgendwasVor, $Array[3] = ["{UP}",$bla_1 , $_blub]
    Local $IrgendwasVor, $AccelKeys[5][2] = [["{UP}", $1Up], ["{DOWN}", $1Down], ['{TAB}', $1Tab], ['+{TAB}', $1STab], ['{Enter}', $1Enter]], $IrgendwasNach

    Da in den Strings einfache und doppelte Anführungszeichen vorkommen können und zum Test der String in Anführungszeichen eingefaßt wird, habe ich die inneren " durch Chr(0x22) ersetzt.

    Mein Ziel ist, die enthaltenen Variablen zu selektieren (blau markiert).
    Mit nachfolgendem Skript klappt das auch. Ich würde jedoch gern in einem Schritt die Variablen ausgeben.
    Also, vielleicht hat ja jemand eine Idee, wie man das Pattern verbessern könnte. Die Vermeidung von Backreferenzen (?:) ist übrigens beabsichtigt.

    [autoit]

    Local $pattern = "(?:\$[\d\w]+\[\d+\](?:\[\d+\])?\s*=\s*)" & _
    "(\[(?:(?:\s*(?:\x22|')[^\x22']+(?:\x22|')\s*?,?)*|(?:\s*(?:\$[\d\w]+)\s*),?)*\]|" & _
    "\[(?:\[(?:(?:\s*(?:\x22|')[^\x22']+(?:\x22|')\s*?,?)*|\s*\$[\d\w]+\s*,?)*\][\s,]*)*\])"

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

    Local $test1D = "Local $IrgendwasVor, $Array[3] = [" & Chr(0x22) & "{UP}" & Chr(0x22) & ",$bla_1 , $_blub]"

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

    Local $test2D = "Local $IrgendwasVor, $AccelKeys[5][2] = [[" & Chr(0x22) & "{UP}" & Chr(0x22) & _
    ", $1Up], [" & Chr(0x22) & "{DOWN}" & Chr(0x22) & ", $1Down], ['{TAB}', $1Tab]" & _
    ", ['+{TAB}', $1STab], ['{Enter}', $1Enter]], $IrgendwasNach"

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

    ; check ob Array-Deklaration enthalten
    Local $ret = StringRegExp($test1D, $pattern, 1), $sOut = ''

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

    ; wenn ja, im Array enthaltene Variablen selektieren
    If IsArray($ret) Then
    ConsoleWrite($ret[0] & @CRLF) ; Arrayinhalt ausgeben
    $ret = StringRegExp($ret[0], '\$[\d\w]+', 3)
    If IsArray($ret) Then
    For $i = 0 To UBound($ret) -1
    $sOut &= $ret[$i] & ', '
    Next
    ConsoleWrite(StringTrimRight($sOut, 2) & @CRLF & @CRLF)
    EndIf
    EndIf

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

    Local $ret = StringRegExp($test2D, $pattern, 1)

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

    ; wenn ja, im Array enthaltene Variablen selektieren
    If IsArray($ret) Then
    $sOut = ''
    ConsoleWrite($ret[0] & @CRLF) ; Arrayinhalt ausgeben
    $ret = StringRegExp($ret[0], '\$[\d\w]+', 3)
    If IsArray($ret) Then
    For $i = 0 To UBound($ret) -1
    $sOut &= $ret[$i] & ', '
    Next
    ConsoleWrite(StringTrimRight($sOut, 2) & @CRLF)
    EndIf
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Hallo,

    meinst Du das so, oder hab ich da was falsch verstanden!

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    ;~ Local $pattern = "(?:\$[\d\w]+\[\d+\](?:\[\d+\])?\s*=\s*)" & _
    ;~ "(\[(?:(?:\s*(?:\x22|')[^\x22']+(?:\x22|')\s*?,?)*|(?:\s*(?:\$[\d\w]+)\s*),?)*\]|" & _
    ;~ "\[(?:\[(?:(?:\s*(?:\x22|')[^\x22']+(?:\x22|')\s*?,?)*|\s*\$[\d\w]+\s*,?)*\][\s,]*)*\])"
    Local $pattern = "(?:\$[\d\w]+\[[\[\d+\]]+\]+)|(?:\$[\d\w]+)"

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

    Local $test1D = "Local $IrgendwasVor, $Array[33] = [" & Chr(0x22) & "{UP}" & Chr(0x22) & ",$bla_1 , $_blub]"

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

    Local $test2D = "Local $IrgendwasVor, $AccelKeys[5][2] = [[" & Chr(0x22) & "{UP}" & Chr(0x22) & _
    ", $1Up], [" & Chr(0x22) & "{DOWN}" & Chr(0x22) & ", $1Down], ['{TAB}', $1Tab]" & _
    ", ['+{TAB}', $1STab], ['{Enter}', $1Enter]], $IrgendwasNach"

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

    ; check ob Array-Deklaration enthalten
    Local $ret = StringRegExp($test1D, $pattern, 3), $sOut = ''
    _ArrayDisplay($ret)
    If IsArray($ret) Then
    For $i = 0 To UBound($ret) -1
    $sOut &= $ret[$i] & ', '
    Next
    ConsoleWrite(StringTrimRight($sOut, 2) & @CRLF & @CRLF)
    EndIf

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

    ; wenn ja, im Array enthaltene Variablen selektieren
    ;~ If IsArray($ret) Then
    ;~ ConsoleWrite($ret[0] & @CRLF) ; Arrayinhalt ausgeben
    ;~ $ret = StringRegExp($ret[0], '\$[\d\w]+', 3)
    ;~ If IsArray($ret) Then
    ;~ For $i = 0 To UBound($ret) -1
    ;~ $sOut &= $ret[$i] & ', '
    ;~ Next
    ;~ ConsoleWrite(StringTrimRight($sOut, 2) & @CRLF & @CRLF)
    ;~ EndIf
    ;~ EndIf

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

    Local $ret = StringRegExp($test2D, $pattern, 3)
    _ArrayDisplay($ret)
    If IsArray($ret) Then
    For $i = 0 To UBound($ret) -1
    $sOut &= $ret[$i] & ', '
    Next
    ConsoleWrite(StringTrimRight($sOut, 2) & @CRLF)
    EndIf

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

    ; wenn ja, im Array enthaltene Variablen selektieren
    ;~ If IsArray($ret) Then
    ;~ $sOut = ''
    ;~ ConsoleWrite($ret[0] & @CRLF) ; Arrayinhalt ausgeben
    ;~ $ret = StringRegExp($ret[0], '\$[\d\w]+', 3)
    ;~ If IsArray($ret) Then
    ;~ For $i = 0 To UBound($ret) -1
    ;~ $sOut &= $ret[$i] & ', '
    ;~ Next
    ;~ ConsoleWrite(StringTrimRight($sOut, 2) & @CRLF)
    ;~ EndIf
    ;~ EndIf

    [/autoit]