StringRegExp-Problem (Gruppe wiederholen)

    • Offizieller Beitrag

    Ich brauche mal eure Hilfe bei einem RegExp-Problem. Und zwar möchte ich eine Gruppe in dem Pattern wiederholen, aber ich weiß nicht, wie ich das hinkriege.
    Hier mal das Beispielscript (auskommentiert, wie es gehen würde, aber das muss doch auch einfacher möglich sein):

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sInput = 'aaa|41|63|43|70|58|52|||||||||||||||3|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
    $sInput &= 'bbb|||||||||||||||||||||2|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
    $sInput &= 'ccc|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|1|0|327|54.500|1|7.50|7.50|aaa' & @CRLF

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

    ; das gibt mir nur den ersten Wert aus. Ich brauche aber zusätzlich die ersten 20 Werte nach den Buchstaben
    $aOut = StringRegExp($sInput, '(\w+)\|(\d*?)\|.+?\R', 3)

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

    ; das folgende würde vom Ergebnis passen, aber geht das nicht einfacher?
    ;~ $aOut = StringRegExp($sInput, '(\w+)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|(\d*?)\|.+?\R', 3)

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

    _ArrayDisplay($aOut)

    [/autoit]
    • Offizieller Beitrag

    Meines Wissens kannst du leere Inhalte ( ||| ) nicht zählen.
    Hierfür würde ich _StringRegExpReplace_Callback verwenden:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $sInput = 'aaa|41|63|43|70|58|52|||||||||||||||3|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
    $sInput &= 'bbb|||||||||||||||||||||2|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
    $sInput &= 'ccc|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|1|0|327|54.500|1|7.50|7.50|aaa' & @CRLF

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

    _StringRegExpReplace_Callback($sInput, '([^|\n]*\|)', "_MyFunc('$1')")
    $aMatch = _MyFunc('_get_Result_')
    _ArrayDisplay($aMatch)

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

    Func _MyFunc($1)
    Local Static $sResult = ''
    Local Static $fStart = False
    Local Static $iNum = 0
    If $1 = '_get_Result_' Then
    Local $sTmp = StringTrimRight($sResult, 2)
    Local $aTmp = StringSplit($sTmp, '@')
    Local $aOut[$aTmp[0]][21]
    Local $aTmp2
    For $i = 1 To $aTmp[0]
    $aTmp2 = StringSplit($aTmp[$i], '|')
    For $j = 1 To $aTmp2[0]
    $aOut[$i-1][$j-1] = $aTmp2[$j]
    Next
    Next
    $sResult = ''
    $fStart = False
    $iNum = 0
    Return $aOut
    EndIf
    If StringRegExp($1, '[\d.]+') Or $1 = '|' Then
    If $fStart Then
    $iNum +=1
    If $iNum > 20 Then
    $iNum = 0
    $sResult = StringTrimRight($sResult, 1) & '@'
    $fStart = False
    Else
    $sResult &= $1
    EndIf
    EndIf
    Else
    If Not $fStart Then
    $fStart = True
    $sResult &= $1
    EndIf
    EndIf
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _StringRegExpReplace_Callback
    ; Description ...: Replaces ByRef all matches in a string by manipulation of the matches in a callback function
    ; Parameters ....: $sString String to manipulate
    ; ...............: $sPattern RegExp pattern for the match
    ; ...............: $sCallback Callback function as string, i.e. "MyCallback('$1')" -- '$1' represents the match
    ; .....optional..: $sBefore String to insert before the manipulated match
    ; .....optional..: $sAfter String to insert after the manipulated match
    ; Return values .: Success 1
    ; ...............: Failure 0 set error = 1
    ; Author ........: Taz77
    ; ===============================================================================================================================
    Func _StringRegExpReplace_Callback(ByRef $sString, $sPattern, $sCallback, $sBefore = '', $sAfter = '')
    $sString = Execute("'" & StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sBefore & "'&" & $sCallback & "&'" & $sAfter) & "'")
    If @error Then
    ConsoleWrite('_StringRegExpReplace_Callback error! Pattern: "' & $sPattern & '", Callback: "' & $sCallback & '"' & @LF)
    Return SetError(1,0,0)
    EndIf
    $sString = StringReplace($sString, Chr(26), "'", 0, 2)
    Return 1
    EndFunc ;==>_StringRegExpReplace_Callback

    [/autoit]
  • So?

    [autoit]

    #include <Array.au3>
    $sInput = 'aaa|41|63|43|70|58|52|||||||||||||||3|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
    $sInput &= 'bbb|||||||||||||||||||||2|0|327|54.500|1|7.50|7.50|aaa' & @CRLF
    $sInput &= 'ccc|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|1|0|327|54.500|1|7.50|7.50|aaa' & @CRLF

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

    ; das gibt mir nur den ersten Wert aus. Ich brauche aber zusätzlich die ersten 20 Werte nach den Buchstaben
    $aOut = StringRegExp($sInput, '\w+((?:\|\d*){20})\|.+?\R', 3)

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

    _ArrayDisplay($aOut)

    [/autoit]
    • Offizieller Beitrag

    BugFix : Interessante Lösung, aber eigentlich zu aufwendig. Dann kann ich das gleich mit den StringFunktionen auseinandernehmen.

    Andy: Das ist zwar nicht ganz, was ich will, aber die Werte kann ich dann mit StringSplit trennen.
    Vorne noch eine Klammer um die Buchstaben (die brauche ich auch):

    [autoit]

    '(\w+)((?:\|\d*){20})\|.+?\R'

    [/autoit]


    So reicht mir das dann schon. Danke, für eure Hilfe!