stringregexp Problem mit |^

  • Hallo,
    Ich habe ein leichten Regülaren Ausdruck geschrieben, dieser Funktioniert auch sehr gut ausser wenn in dem Test-String eine | enthalten ist (auf jeden fall denke ich dass es daran liegt).
    So funktioniert es mit diesem String ganz normal:

    [autoit]

    StringRegExp ('22 146 2 "Belgica"', '(\d+)\s*(\d+)\s*(\d+)?\s*"(.+)"',3)

    [/autoit]


    Aber sobal ein | darin vorkommt wie in diesem 18 58 1 "|KS|^EDETHAWK" geht es nicht.

    Danke für eure Hilfe :)
    Tom

  • Was ist los ?
    Versteht ihr nicht was ich mein oder wisst ihr auch nicht was falsch ist ?
    Ups ^^ hab gerade geschrieben als du geantwortet hast.
    Denk zwar nicht das es nützlich ist da der Fehler nur bei so namen mit | vorkommt aber egal.

    • Offizieller Beitrag

    Genau, es nutzt | als Trennzeichen

    [autoit]

    Global $re = StringRegExp ('22 146 2 "Belgica"', '(\d+)\s*(\d+)\s*(\d+)?\s*"(.+)"',3)
    Global $re1 = StringRegExp ('18 58 1 "|KS|^EDETHAWK"', '(\d+)\s*(\d+)\s*(\d+)?\s*"(.+)"',3)
    For $i = 0 To UBound($re) - 1
    ConsoleWrite($i & ": " & $re[$i] & @CRLF)
    ConsoleWrite($i & ": " & $re1[$i] & @CRLF)
    Next

    [/autoit]

    Mega

  • Ok danke euch beiden :) :thumbup: :thumbup: :thumbup: :thumbup:
    Ich hab aber noch 1 Frage ... Kennt ihr den Link zu dieser Seite mit den Richtlinien für UDFs?

    Und Falls ihr Lust hättet mal über den Script zu schauern ob alles so in Ordnung ist oder ihr verbesserung Vorschläge hab. 8) DANKE

    [autoit]

    #include <Array.au3>

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

    UDPStartup ()

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

    ;$socket = UDPOpen ( "206.222.12.26", 20100 ) ; SOF2 Server
    $socket = UDPOpen ( "87.106.223.228" , 27960 ) ; Urban Terror

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

    $header = chr ( 255 ) & chr ( 255 ) & chr ( 255 ) & chr ( 255 )

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

    UDPSend ( $socket, $header & "getstatus" )

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

    $sRecv = ""
    $iCountEmptyRecv = 0

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

    while 1
    $sBuffer = UDPRecv ( $socket, 100000000 )

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

    if ($sBuffer = "" and $sRecv <> "") or @error then
    ExitLoop
    Else
    $sRecv &= $sBuffer
    EndIf

    if $sBuffer = "" Then
    $iCountEmptyRecv += 1
    if $iCountEmptyRecv > 2 Then
    ExitLoop
    EndIf
    EndIf

    WEnd

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

    $asSplit = StringSplit ( $sRecv, @lf )
    if @error Then
    ;error
    Else

    $asInfo = stringsplit ( StringMid ($asSplit[2],2) , "\" )
    dim $avPlayers[1][4]
    $avPlayers[0][0] = 0
    if $asSplit[0] > 3 then
    redim $avPlayers[$asSplit[0]-2][4]

    for $i = 3 to $asSplit[0]
    $avPlayerInfo = StringRegExp ( $asSplit[$i], '(\d+)\s*(\d+)\s*(\d+)?\s*"(.+)"',3)
    if IsArray ( $avPlayerInfo ) Then
    $avPlayers[$i-2][0] = $avPlayerInfo[0]
    $avPlayers[$i-2][1] = $avPlayerInfo[1]
    $avPlayers[$i-2][2] = $avPlayerInfo[2]
    $avPlayers[$i-2][3] = $avPlayerInfo[3]
    EndIf
    Next
    $avPlayers[0][0] = $asSplit[0]-3
    Else
    $avPlayers = 0
    EndIf


    dim $asTmp[(UBound ($asInfo)/2)+2][2]
    $b = 1
    for $i = 1 to $asInfo[0] step 2
    $asTmp[$b][0] = $asInfo[$i]
    $asTmp[$b][1] = $asInfo[$i+1]
    $b += 1
    next
    $asTmp[0][0] = $b
    $asTmp[$b][0] = $avPlayers
    $asInfo = $asTmp
    EndIf

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



    _ArrayDisplay ( $asInfo[$asInfo[0][0]][0] )

    [/autoit]
    • Offizieller Beitrag

    Hab mal kurz drüber geschaut, handwerklich sauber ;) .

    Ich bevorzuge beim Iterieren durch Arrays die Angabe der Obergrenze mit UBound($array) -1 anstelle eines evtl. vorhandenen Zählers in $array[0].
    Hintergrund ist, dass zum Einen sofort ersichtlich ist, dass bis zur Obergrenze durchlaufen wird und zum Anderen ist diese Angabe in jedem Fall korrekt.

  • Ok, das ist wohl war ^^, obwohl ich nicht denke das stringsplit lügt.
    Ich hatte mir eher Sorgen um mein Daten empfang gemacht.