Stringregexp -Geeigentes Pattern gesucht.

  • Hey,

    folgendes Problem:

    2 Strings immer nach diesem Aufbau (Z=Ziffer): ZZZZ oder ZZ.ZZ
    Das gewünschte Ergebnis ist ein Array:

    $aZiffer[0]=ZZ
    $aZiffer[1]=ZZ

    Der "." soll also ignoriert werden und gleichzeitig der Arrayaufbau immer gleich sein!

    [autoit]


    #include <array.au3>
    $1="25.12"
    $2="2512"
    $pattern="(\d{2})(\d{2})"

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

    $atest=StringRegExp($1,$pattern,1)
    _ArrayDisplay($atest)
    $atest=StringRegExp($2,$pattern,1)
    _ArrayDisplay($atest)

    [/autoit]

    Ich hoffe das Problem ist halbwegs verständlich beschrieben :D

    Gruß nuts

    Einmal editiert, zuletzt von nuts (12. Oktober 2010 um 21:12)

  • [autoit]

    #include <array.au3>
    $1 = "25.12"
    $2 = "2512"
    $3 = "251234.44.55.66"
    $pattern = "(\d{2}+)"

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

    $atest = StringRegExp($1, $pattern, 3)
    _ArrayDisplay($atest, "1")
    $atest = StringRegExp($2, $pattern, 3)
    _ArrayDisplay($atest, "2")
    $atest = StringRegExp($3, $pattern, 3)
    _ArrayDisplay($atest, "3")

    [/autoit]
  • Ich kann leider nicht Pattern hab dir die lösung aber anders gemacht

    $aZiffer[0]= Anzahl der eintragungen

    $aZiffer[1]=erste zahl
    $aZiffer[2]=zweite zahl

    [autoit]

    #include <array.au3>
    $1 = "25.12"
    $2 = "2512"

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

    $versuch1 = _Strigsplitbymidleordelimeters($1)
    _ArrayDisplay($versuch1)
    $versuch2 = _Strigsplitbymidleordelimeters($2)
    _ArrayDisplay($versuch2)

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

    Func _Strigsplitbymidleordelimeters($String)
    If StringInStr($String, ".") Then
    $atest = StringSplit($String, ".")
    Return $atest
    Else
    $len = StringLen($String) / 2
    Dim $atest[3]
    $atest[0] = 2
    $atest[1] = StringTrimRight($String, $len)
    $atest[2] = StringTrimLeft($String, $len)
    Return $atest
    EndIf
    EndFunc ;==>_Strigsplitbymidleordelimeters

    [/autoit]
  • Moin,

    Also suchst du sowas hier?

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    $sString = "In diesem String stehen Zahlen. Eine wäre zum beispiel 224! " & _
    "Dann gibt es aber auch noch 25.23 oder 2555. " & _ ; <- diese beiden
    "Alle Zahlen die nicht im Format 11.11 oder 1111 sind, werden ignoriert. " & _ ; <- und diese beiden
    "So auch die Zahl 123456 oder 82324.24 - Viel Spaß!"

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

    $sPattern = "\b(\d{2})\.?(\d{2})\b"
    $aRet = StringRegExp($sString, $sPattern, 3)

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

    For $i = 0 To UBound($aRet) - 1 Step 2
    MsgBox(0, "", _
    "$aRet[" & $i & "] = " & $aRet[$i] & @LF & _
    "$aRet[" & $i + 1 & "] = " & $aRet[$i + 1])
    Next
    _ArrayDisplay($aRet)

    [/autoit]
  • Fast.
    Es soll außer dem Format ZZZZ oder ZZ.ZZ keine Treffer geben:

    [autoit]


    #include <array.au3>
    $1 = "25.12"
    $2 = "2512"
    $3 = "251234.44.55.66"
    $sPattern = "\b(\d{2})\.?(\d{2})\b"
    $aRet = StringRegExp($1, $sPattern, 3)
    _ArrayDisplay($aRet)
    $aRet = StringRegExp($2, $sPattern, 3)
    _ArrayDisplay($aRet)
    $aRet = StringRegExp($3, $sPattern, 3)
    _ArrayDisplay($aRet)

    [/autoit]
  • Wichtig wäre dann noch zu wissen, ob der String NUR aus diesen Zahlen besteht, oder ob da auch noch Text o.ä. dabeisteht.

    Für den ersten Fall könntest du ^ und $ nutzen:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    $1 = "25.12"
    $2 = "2512"
    $3 = "251234.44.55.66"
    $sPattern = "^(\d{2})\.?(\d{2})$"
    $aRet = StringRegExp($1, $sPattern, 3)
    _ArrayDisplay($aRet)
    $aRet = StringRegExp($2, $sPattern, 3)
    _ArrayDisplay($aRet)
    $aRet = StringRegExp($3, $sPattern, 3)
    _ArrayDisplay($aRet)

    [/autoit]

    Für den Fall dass da noch Text beisteht, müsste man sich was anderes Überlegen...

  • Der String ist max. 5 Zeichen lang und kann alles beinhalten was die Tastatur hergibt.

    Bei ZZ.ZZ -> Treffer -> Ausgabe $array[0]=ZZ & $array[1]=ZZ
    Bei ZZZZ -> Treffer -> Ausgabe $array[0]=ZZ & $array[1]=ZZ
    Ansonsten @error=1 für "no match"

    Es soll anschließend auf _Dateisvalid() geprüft werden und mit einem entsprechenden Regexp könnte man die Überprüfung sehr kurz halten.
    Daher auch der gewünschte gleiche Aufbau des Arrays (ein Array mit den 2 Zahlenpaaren)
    Scheint aber gar nicht so einfach zu sein, mit den Stringfunktionen oder weiteren Fallunterscheidungen bekomm ichs schon hin.

    Mit nem richtigen Pattern wäre die Überprüfung aber nur wenige Zeilen lang ;)

    [autoit]


    Func _Checkdateinput($sdate)
    ;$sDate = max 5 Zeichen mit allem was die Tastatur hergibt
    local $pattern="" ;tjo :D
    local $year="2010"
    local $acheck=StringRegExp($sdate,$pattern, 3)
    if not @error=1 then
    if _DateIsValid($year&"/"$acheck[1]&"/"$acheck[0]) then return true
    endif
    return false
    endfunc

    [/autoit]

    Einmal editiert, zuletzt von nuts (12. Oktober 2010 um 13:54)