Regulärer Ausdruck für Koordinaten (in String-Form)

  • Hallo,

    ich hänge grade bei folgendem Problem:

    Spoiler anzeigen
    [autoit]

    #NoTrayIcon

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

    #include <Array.au3>

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

    Opt("MustDeclareVars", 1)

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

    Exit main()

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

    Func main()
    Local $sTextErr = "öfajß9{1;43}{23;32}{2;32}{24;3}h8f20"
    Local $sTextOk = "{1;43}{23;32}{2;32}{24;3}"

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

    ;~ Funktioniert nicht für beide, da +? natürlich den kleinsten Treffer zurückgibt (erkennt aber, dass $sTextErr inkorrekt ist).
    Debug(_Coordinate_StringToArray_1($sTextErr), $sTextErr)
    Debug(_Coordinate_StringToArray_1($sTextOk), $sTextOk)

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

    ;~ Funktioniert nicht für $sTextErr, da keine Anfangs- und Endekennung (erkennt $sTextErr also als korrekt an).
    Debug(_Coordinate_StringToArray_2($sTextErr), $sTextErr)
    Debug(_Coordinate_StringToArray_2($sTextOk), $sTextOk)
    EndFunc ;==>main

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

    Func Debug(Const $asMatch, Const $sTEXT = "")
    _ArrayDisplay($asMatch, $sTEXT)
    EndFunc ;==>Debug

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

    Func _Coordinate_StringToArray_1(Const $sTEXT)
    Local Const $asMatch = StringRegExp($sTEXT, "^(?:{(\d+;\d+){1}})+$", 3)
    If @error Then Return SetError(@error, 0, "")
    Return $asMatch
    EndFunc ;==>_Coordinate_StringToArray_1

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

    Func _Coordinate_StringToArray_2(Const $sTEXT)
    Local Const $asMatch = StringRegExp($sTEXT, "(?:{(\d+;\d+){1}})+?", 3)
    If @error Then Return SetError(@error, 0, "")
    Return $asMatch
    EndFunc ;==>_Coordinate_StringToArray_2

    [/autoit]


    Wie aus dem Quellcode hervorgeht, möchte ich die Rückgabe, wie bei UDF 1, muss aber auf Anfang und Ende prüfen...

    Wäre dankbar für ein verbessertes Pattern!

    MFG

    Einmal editiert, zuletzt von teh_hahn (10. Juni 2009 um 15:20)

  • Moin,

    scheint bei mir zu funktionieren ...

    [autoit]


    Local $sTextErr0 = "öfajß9{1;43}{23;32}{2;32}{24;3}h8f20"
    Local $sTextErr1 = "{1;43}{23;32}{2;32}{24;3}h8f20"
    Local $sTextErr2 = "öfajß9{1;43}{23;32}{2;32}{24;3}"

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

    ...

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

    Func _Coordinate_StringToArray_2(Const $sTEXT)
    Local Const $asMatch = StringRegExp($sTEXT, "\A(?:{(\d+;\d+){1}})+?\z", 3)
    If @error Then Return SetError(@error, 0, "")
    Return $asMatch
    EndFunc ;==>_Coordinate_StringToArray_2

    [/autoit]


    Gruß
    Greenhorn


  • Danke, aber es wird nur

    Code
    [0]|24;3

    zurückgegeben. Ich benötige ja ein Array mit mehreren Koordinaten. Deine UDF macht das Gleiche wie _Coordinate_StringToArray_1 von mir...

  • Du musst es auf zwei Mal machen. Erst den String testen und danach aufteilen:

    [autoit]

    Func _Coordinate_StringToArray(Const $sTEXT)
    If StringRegExp($sTEXT, "^(?:\{(\d+;\d+)\})+$")=False Then Return SetError(1+(@error=0), 0, "")
    Return StringRegExp($sTEXT, "\{(\d+;\d+)\}", 3)
    EndFunc ;==>_Coordinate_StringToArray_1

    [/autoit]
    • Offizieller Beitrag

    Hätte nicht so auch gereicht?

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Opt("MustDeclareVars", 1)

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

    Exit main()

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

    Func main()
    Local $sTextErr = "öfajß9{1;43}{23;32}{2;32}{24;3}h8f20"
    Local $sTextOk = "{1;43}{23;32}{2;32}{24;3}"
    Local $re
    $re = _getCo($sTextErr)
    If $re <> 0 Then _ArrayDisplay($re)
    $re = _getCo($sTextOk)
    If $re <> 0 Then _ArrayDisplay($re)
    EndFunc ;==>main

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

    Func _getCo($str)
    Local $pattern = '\A{(\d+;\d+)}{(\d+;\d+)}{(\d+;\d+)}{(\d+;\d+)}$', $re = StringRegExp($str, $pattern, 3)
    If Not IsArray($re) Then Return -1
    Return $re
    EndFunc ;==>_getCo

    [/autoit]


    Mega

  • Hi,

    ganz vergessen mich bei Dir zu bedanken, progandy. Genau so sollte es sein. Meine finale Version (für dieses Problem) sieht folgendermaßen aus:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    Opt("MustDeclareVars", 1)

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

    Exit main()

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

    Func main()
    Local $asMatch = 0
    Local $sTextErr = "notAllowed{1;43}{23;32}{2;32}{24;3}notAllowed"
    Local $sTextOk = "{1;43}{23;32}{2;32}{24;3}{0;21990}"

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

    $asMatch = _Coordinate_StringToArray($sTextErr)
    _ArrayDisplay($asMatch)
    $asMatch = _Coordinate_StringToArray($sTextOk)
    _ArrayDisplay($asMatch, "OK")
    EndFunc ;==>main

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

    Func _Coordinate_StringToArray(Const $sTEXT)
    If Not StringRegExp($sTEXT, "^(\{\d+;\d+\})+?$") Then Return SetError(@error, 0, 0)
    Local Const $asMatch = StringRegExp($sTEXT, "\{\d+;\d+\}", 3)
    If @error Then Return SetError(@error, 0, 0)
    Return $asMatch
    EndFunc ;==>_Coordinate_StringToArray

    [/autoit]


    Ich brauchte dann doch die geschweiften Klammern. ( Xenobiologist : Klar, würde das gehen, allerdings nur für vier Koordinaten in String-Form. Mein Beispiel war allerdings auch unschön gewählt. Trotzdem danke!)

    PS: Brauchte das Pattern für eine Klasse in Java, da hab ich Euch einfach mal für missbraucht. :D