StringRegExp Function incl. Header bekommen?

  • Hi

    Wie extrahiere ich aus einer au3 eine Funktion incl. Header?
    Also die Function plus alle Zeilen davor, welche mit einem ";" beginnen

    Zwischen Header und Funktion kann manchmal eine Leerzeile sein und die erste Zeile des Headers ist leider nicht immer die selbe

    [autoit]


    ; irgendeine Zeile; soll nicht zurückgegeben werden

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

    ; irgendeinText ====================================================================================================================
    ; Name...........: _Functionname
    ; ...

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

    Func _Function()
    ...
    EndFunc

    [/autoit]

    Danke

  • Spoiler anzeigen
    [autoit]

    #Include <Array.au3>

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

    $aUDF = _GetFunctionFromUDF(StringReplace(@AutoItExe, "autoit3.exe", "") & "Include\Array.au3")
    If @error Then Exit
    ConsoleWrite($aUDF[Random(0, UBound($aUDF) - 1)] & @cr)

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

    Func _GetFunctionFromUDF($sUDF)
    ;funkey 04.03.2011
    Local $hFile = FileOpen($sUDF, 0)
    Local $sFile = FileRead($hFile)
    FileClose($hFile)
    Local $aFile = StringSplit($sFile, @CRLF, 3)
    $aRegExp = StringRegExp($sFile, "(?!End)Func \b.+[\w\W]+?EndFunc", 3)
    If @error Then Return SetError(1, 0, "")
    Local $aTemp, $sTemp, $sTemp2
    For $i = 0 To UBound($aRegExp) -1
    $aTemp = StringSplit($aRegExp[$i], @CRLF, 3)
    For $j = 0 To UBound($aFile) - 1
    If $aTemp[0] = $aFile[$j] Then
    $sTemp = StringLeft(StringStripWS($aFile[$j - 1], 1), 1)
    $sTemp2 = StringLeft(StringStripWS($aFile[$j - 2], 1), 1)
    If $sTemp = ";" Or $sTemp2 = ";" Then
    For $k = $j - 1 To 0 Step -1
    If StringLeft(StringStripWS($aFile[$k], 1), 1) = ";" Or $k = $j - 1 Then
    $aRegExp[$i] = $aFile[$k] & @CRLF & $aRegExp[$i]
    Else
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    Next
    Next
    Return $aRegExp
    EndFunc

    [/autoit]
  • Spoiler anzeigen
    [autoit]

    $File = @ProgramFilesDir & "\AutoIt3\Include\WinAPI.au3"
    $Content = FileRead($File)

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

    $FuncName = "_WinAPI_CreateFontIndirect"
    $aFunc = StringRegExp($Content, "(?im)(^;.*\n)+\s*func\s+" & $FuncName & "(?s).*?endfunc.*?$", 2)
    MsgBox(0, "WinAPI.au3", $aFunc[0])

    [/autoit]


    ... könnte klappen.

  • Bin zwar noch am RegEx lernen, aber ich hab jetzt auch mal was zusammengebastelt.
    Übung macht den Meister :)

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $Dateipfad = 'C:\Programme\AutoIt3\Include\array.au3'

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

    $aArray = _GetFunc($Dateipfad)
    _ArrayDisplay($aArray)

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

    $sFunc = _GetFunc($Dateipfad, "_arrayDisplay")
    ConsoleWrite($sFunc & @CRLF)

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

    Func _GetFunc($File, $Func = "")
    ConsoleWrite("1" & @CRLF)
    $sTextfromFile = FileRead($File)
    If Not $Func Then
    ConsoleWrite("2" & @CRLF)
    Return StringRegExp($sTextfromFile, '(?iU)((?:;.*\s)+\s*Func(?s).*EndFunc.*)', 3)
    Else
    ConsoleWrite("3" & @CRLF)
    $aRegEx = StringRegExp($sTextfromFile, '(?iU)((?:;.*\s)+\s*Func ' & $Func & '(?s).*EndFunc.*)', 3)
    If Not @error and Ubound($aRegEx) = 1 Then
    Return $aRegEx[0]
    EndIf
    EndIf
    EndFunc

    [/autoit]

    Würd mich freuen wenn mir einer der RegEx-Profis Tipps zum "Besser machen" geben könnte :)

  • Hier auch noch ne Version von mir etwas länger als die anderen.

    Spoiler anzeigen
    [autoit]

    $sPattern = _
    "(?mx)" & _
    "^\s*;[^=\r\n]*=.*\r\n(?# Erste Zeile des Headers)" & _
    "(?>^[ \t]*;.+\r\n)+ (?# Weitere Zeilen des Headers)" & _
    "(?>[\t ]*\r\n)? (?# Leerzeilen zwischen Header und Funktion)" & _
    "Func .+\r\n (?# Hier eventuell Funktionsnamen einfügen)" & _
    "(?>.+\r\n)+ (?# Die Funktion selbst..)" & _
    "EndFunc"

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

    $sRead = FileRead(@ProgramFilesDir & "\AutoIt3\Include\GDIPlus.au3")
    $aFunc = StringRegExp($sRead, $sPattern, 3)

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

    For $i = 0 To UBound($aFunc) - 1
    ConsoleWrite($aFunc[$i] & @CRLF & @CRLF & @CRLF & @CRLF)
    Next

    [/autoit]

    In DescribeIthabe ich, wenn ich mich nicht täusche, auch ein paar Patterns eingabut die ziemlich verkorkste Header erkennen können. Vielleicht bringt es dir ja was.