brauche regex hilfe

  • hallo,

    ich habe ein kleines regex Problem, ich möchte eine ip-Rang auslesen lassen die folgendermaßen aussieht:

    127.0.0.1 - 127.255.255.255
    oder
    127.0.0.1 127.255.255.255

    den regex für eine ip habe ich schon gefunden:

    [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

    also müsste ich daraus das hier machen:

    [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} HIER KOMMT LEERZEICHEN ODER STRICH MIT ZWEI LEERZEICHEN [0-9]{1,3}\.[0-9]{1,3}\.[0-9{1,3}\.[0-9]{1,3}

    so nun leider keine Ahnung wie ich das machen soll, bin um jede hilfe dankbar :)

    lg bebop

    Einmal editiert, zuletzt von bebop (9. Oktober 2009 um 15:49)

  • Ich habe das so verstanden, daß er den Bereich im String sucht, bei dem eine IP_Adresse gefolgt von einem Leerzeichen, einem Querstrich, einem Leerzeichen und einer weiteren IP-Adresse matcht.....

  • Hi,
    hab schon lang nix mehr mit RegExp gemacht.
    Willst du prüfen ob sie stimmten, oder auslesen?

    Zum prüfen:

    [autoit]

    MsgBox(0,"",StringRegExp("127.0.0.1 - 127.255.255.255", "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\s?-\s?|\s)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))

    [/autoit]

    Zum auslesen:

    [autoit]

    #include <Array.au3>

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

    $arr = StringRegExp("127.0.0.1 - 127.255.255.255", "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:\s?-\s?|\s)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", 3)
    _ArrayDisplay($arr)

    [/autoit]

    Vielleicht gehts einfacher :P.

  • will die auslesen aus einer *.txt-Datei

    habe mal des versucht von anno2008, aber leider funktioniert das nicht.

    [autoit]

    $ips = StringRegExp("bitte schauen sie hier nach 127.0.0.0 - 127.255.255.255 und hier ist noch mehr sinnlostext", '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} - [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', 3)
    $ips = $ips[0]

    [/autoit]

    so ich will das aus dem ganzen Text danach nur noch in $ips die rang steht, aber es kann auch vorkommen das zwischen den beiden ips kein " - " ist sondern nur ein " " (leerzeichen) steht, aber der regex soll beide erkennen und das tut er bei meinen oben nicht.

  • z.B. so

    Spoiler anzeigen
    [autoit]

    $PatIP = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
    $ips = StringRegExp("bitte schauen sie hier nach 127.0.0.0 127.255.255.255 und hier ist noch mehr sinnlostext", '('&$PatIP&' - '& $PatIP & ')|(' & $PatIP&' '&$PatIP&')' , 3)
    $ips = $ips[UBound($ips)-1]

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

    MsgBox(0,"", $ips)

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • habe des mal in mein script eingebaut, hier mal komplett:

    [autoit]

    $file_in = FileOpen("in.txt", 0)
    $file_out = FileOpen("out.txt", 1)

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

    While 1
    $line = FileReadLine($file_in)
    If @error = -1 Then ExitLoop

    $PatIP = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
    $ip = StringRegExp($line, '('&$PatIP&' - '& $PatIP & ')|(' & $PatIP&' '&$PatIP&')', 3)
    if @error = 1 Then
    Else
    $ip = $ip[0]
    FileWriteLine($file_out, $ip)
    EndIf
    Wend

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

    FileClose($file_in)
    FileClose($file_out)

    [/autoit]

    leider schreibt des mir nun in die "out.txt" in manche Zeilen gar nichts rein, könnte daran liegen das in der "in.txt" in manchen Zeilen gar keine ip ist. Kann mir jemand verraten wie ich das Problem löse?

  • Ich kapier ned mehr so ganz was du willst!?
    Meinst du vielleicht so?

    Spoiler anzeigen
    [autoit]

    $file_in = FileOpen("in.txt", 0)
    $file_out = FileOpen("out.txt", 2)

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

    $line = FileRead($file_in)
    If Not @error Then
    $ip = StringRegExp($line, "(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?:\s?-\s?|\s)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", 3)
    If Not @error Then
    For $i = 0 To UBound($ip) - 1
    FileWriteLine($file_out, $ip[$i])
    Next
    EndIf
    EndIf

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

    FileClose($file_in)
    FileClose($file_out)

    [/autoit]
  • danke dir anno, hat einwandfrei funktioniert, nun nur noch eine kleine Frage, wozu ist "UBound" habe in der Hilfedatei geschaut aber ich versteh das nicht so recht...

    lg bebop

  • ubound gibt die länge eines arrays zurück, quasi wieviele elemente ein array umfasst

    bei einem array das von array[0] bis array[30] geht gibt ubound 31 zurück.

  • Hi,

    Zitat

    wozu ist "UBound" habe in der Hilfedatei geschaut aber ich versteh das nicht so recht...


    UBound gibt dir die Grösse der Dimension eines Arrays zurück....allerdings ist diese Grösse der Dimension nicht immer schon vorher festgelegt!

    Du dimensionierst in der Regel ein Array VOR der Verwendung mit z.B

    [autoit]

    DIM $aArray[10] ;Achtung Nullbasiert! $aArray[0] bis $aArray[9]

    [/autoit]


    Allerdings kann es auch vorkommen, daß dir eine Funktion ein Array zurückgibt von dem du die Dimensionen garnicht wissen kannst. Um nicht auf ungültige Indizes im Array zuzugreifen, bestimmst du die "Obergrenze" mittels Ubound.
    Allerdings lauert dort ein Stolperstein, denn Ubound gibt dir die Größe der Dimension, d.h. die Anzahl der Array-Items.
    Im oben genannten Beispiel mit DIM $aArray[10] wird Ubound($aArray) also 10 sein...
    Das führt bei folgendenm Script zum Fehler:

    [autoit]

    DIM $aArray[10] ;Achtung Nullbasiert! $aArray[0] bis $aArray[9]
    For $i= 1 to ubound($aArray)
    $aArray[$i]=$i
    next

    [/autoit]


    %i zählt von 1 bis 10, allerdings ist das Array dimensioniert von 0 bis 9!!!!!
    Daher immer nur bis Ubound()-1 Zählen!

    [autoit]

    DIM $aArray[10] ;Achtung Nullbasiert! $aArray[0] bis $aArray[9]
    For $i= 0 to ubound($aArray)-1 ; das "nullte" Item soll auch verwendet werden, also von 0 bis 9
    $aArray[$i]=$i
    next

    [/autoit]