_StringRegExpTo2DArray()

  • Hey.

    Da ich es brauchte, hab ich mir eine Funktion geschrieben, welche mir dei Subpattern von StringRegExp in einem Zweidimensionalen Array zurück gibt.
    Erkannt wird dowas bsw. noch nicht :

    [autoit]

    '\(.+\)'

    [/autoit]

    Naja vllt. kann es ja jemand gebrauchen :

    Spoiler anzeigen
    [autoit]

    Func _StringRegExpTo2DArray($sString, $sPattern)
    ;by Darter
    Local $aUbound = StringRegExp($sPattern, '(\([^\)]+)+',3)
    If @error Then Return SetError(1,'',-1)
    $aUbound = UBound($aUbound)
    Local $aArray[1][$aUbound], $k
    Local $aMatches = StringRegExp($sString, $sPattern, 3)
    If @error Then Return SetError(2,'',-1)
    For $i = 0 To UBound($aMatches)-1 Step $aUbound
    If $i = 0 Then
    For $j = 0 To $aUbound -1
    $aArray[0][$j] = $aMatches[$j]
    Next
    Else
    ReDim $aArray[$i/$aUbound+1][$aUbound]
    $k = 0
    For $j = $i To $i + $aUbound -1
    $aArray[UBound($aArray)-1][$k] = $aMatches[$j]
    $k += 1
    Next
    EndIf
    Next
    Return $aArray
    EndFunc

    [/autoit]

    und hier ein Bsp. :

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $sData = '<id="1" name="eins">' & @CRLF & _
    '<id="2" name="zwei">' & @CRLF & _
    '<id="3" name="drei">'

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

    $aFound = _StringRegExpTo2DArray($sData, 'id="(\d+)".+name="(.+)"')

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

    _ArrayDisplay($aFound)

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

    Func _StringRegExpTo2DArray($sString, $sPattern)
    ;by Darter
    Local $aUbound = StringRegExp($sPattern, '(\([^\)]+)+',3)
    If @error Then Return SetError(1,'',-1)
    $aUbound = UBound($aUbound)
    Local $aArray[1][$aUbound], $k
    Local $aMatches = StringRegExp($sString, $sPattern, 3)
    If @error Then Return SetError(2,'',-1)
    For $i = 0 To UBound($aMatches)-1 Step $aUbound
    If $i = 0 Then
    For $j = 0 To $aUbound -1
    $aArray[0][$j] = $aMatches[$j]
    Next
    Else
    ReDim $aArray[$i/$aUbound+1][$aUbound]
    $k = 0
    For $j = $i To $i + $aUbound -1
    $aArray[UBound($aArray)-1][$k] = $aMatches[$j]
    $k += 1
    Next
    EndIf
    Next
    Return $aArray
    EndFunc

    [/autoit]

    mfg Darter

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Ich würde dir vorschlagen, den StringRegExp mit Flag 4 auszuführen und dann die verschachtelten Arrays in ein 2D-Array umsortieren. Das sollte schneller und besser gehen.

  • Ich muss ehrlich zugeben, ich hab StringRegExp noch nie mit Flag 4 laufen lassen xD

    StringRegExp gibt mir mit Flag 4 also ein Array zurück, in deren Elementen sitzt dann wieder ein Array, welches die Subpattern enthält ?

    Das finden von Rechtschreibfehlern muss sofort und unverzüglich dem Autor gemeldet werden. Das eigennützige Verwenden dieser Rechtschreibfehler ist strengstens untersagt und kann mit Freiheitsenzug bestraft werden.

  • Ich würde dir vorschlagen, den StringRegExp mit Flag 4 auszuführen und dann die verschachtelten Arrays in ein 2D-Array umsortieren. Das sollte schneller und besser gehen.


    [ gelöst ] IniReadSection Größenbeschränkung (und in ganz vielen anderen Threads)

    [autoit]

    Func _RegExp($sTest, $sPattern, $iOffset = 0)
    ; Easy RegExp with >1 Subpattern (SEuBo)
    Local $aRet, $iUB, $iUB2, $aDummy, $aNewArr
    $aRet = StringRegExp($sTest, $sPattern, 4, $iOffset)
    If @error Then Return ConsoleWrite(@extended & @CRLF)

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

    Local $iUB = UBound($aRet), $iUB2 = UBound($aRet[0]), $aNewArr[$iUB][$iUB2 - 1]
    For $i = 0 To $iUB - 1
    Local $aDummy = $aRet[$i], $iUBD = UBound($aDummy)

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

    If $iUBD - 1 > $iUB2 Then
    $iUB2 = $iUBD
    ReDim $aNewArr[$iUB][$iUB2]
    EndIf
    For $j = 1 To $iUBD - 1
    $aNewArr[$i][$j - 1] = $aDummy[$j]
    Next
    Next
    Return $aNewArr
    EndFunc ;==>_RegExp

    [/autoit]