- 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.
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 $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"
; check ob Array-Deklaration enthalten
Local $ret = StringRegExp($test1D, $pattern, 1), $sOut = ''
; 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
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