StringRegExp Hilfe

  • Hallo,
    Heute mal versucht mit StringRegExp klarzukommen
    ich gehe irgendwie daran kaputt, wie muss das Pattern aussehen wenn ich eine bestimmte zahl aus Quelltext haben will?

    Bin in Englisch leider nicht so stark , Hilfe hilft mir nicht wirklich.

    Kann mir jemand bitte verständlich erklären ?(


    Habe mir von einer Seite wo ich angemeldet bin einfach mal den Quelltext genommen

    Code
    <tr><td style="height:8px;"></td></tr>
     <tr><td><a class="ubild" href="http://www.dreamlevel.de/profil.dl?u=3856" onmouseover="return overlib('<div style=\'width:150px;\'>3,2,1 deins?</div>');" onmouseout="return nd();"><img src="http://www.dreamlevel.de/userbilder/w/3856/3856-h6h4w9g1.jpg" alt="Bild"></a></td></tr>
     <tr><td style="height:8px;"></td></tr>
     <tr><td><a class="ubild" href="http://www.dreamlevel.de/profil.dl?u=7505" onmouseover="return overlib('<div style=\'width:150px;\'>;)</div>');" onmouseout="return nd();"><img src="http://www.dreamlevel.de/userbilder/w/7505/7505-h6a3r4n5.jpg" alt="Bild"></a></td></tr>
     <tr><td style="height:8px;"></td></tr>
     <tr><td><a class="ubild" href="http://www.dreamlevel.de/profil.dl?u=703" onmouseover="return overlib('<div style=\'width:150px;\'>Hey...? Nich auf meinem Bild fummeln -&gt; drücken! :)</div>');" onmouseout="return nd();"><img src="http://www.dreamlevel.de/userbilder/w/703/703-p2u8b2o1.jpg" alt="Bild"></a></td></tr>
     <tr><td style="height:8px;"></td></tr>
     <tr><td><a class="ubild" href="http://www.dreamlevel.de/profil.dl?u=6994"><img src="http://www.dreamlevel.de/userbilder/w/6994/6994-d1o7a8p5.jpg" alt="Bild"></a></td></tr>
     <tr><td style="height:8px;"></td></tr>

    Wie muss das Pattern aussehen damit ich von

    Code
    http://www.dreamlevel.de/profil.dl?u=3856"

    nur

    Code
    3856

    erhalte?

    PS Mit StringBetween habe ich es versucht, dort klappt es jetzt :D

    Einmal editiert, zuletzt von Pinguin (8. November 2007 um 00:46)

  • hallo, das haut nicht ganz hin mit stringbetween bekomme ich dieses ergebniss

    Code
    15675
    3856
    7505
    703
    6994
    8048
    20224
    19948

    mit SringRegExp

    dieses

    Code
    01 
    1 
    2005 
    2007 
    28 
    49 
    59 
    62

    \d* steht für Ziffern (Match any digit (0-9))was bewirkt aber das "*"

    • Offizieller Beitrag

    Hi!

    Mal zum Testen:

    [autoit]

    #include <Array.au3>
    $array = StringRegExp("http://www.dreamlevel.de/profil.dl?u=6994", "\d+", 1)
    _ArrayDisplay($array)

    [/autoit]

    * liefert null oder mehr Treffer der Gruppe davor (also Ziffer). Wir brauchen aber + (einen oder mehr Treffer).

    Für deinen Fall noch die anderen Links ausgeschlossen und die Zahl gruppiert, damit sie gemeinsam im Array steht:

    [autoit]

    #include <Array.au3>
    $array = StringRegExp('<a class="ubild" href="http://www.dreamlevel.de/profil.dl?u=6994"><img src="http://www.dreamlevel.de/userbilder/w/6994/6994-d1o7a8p5.jpg" alt="Bild"></a></td></tr><tr><td style="height:8px;"></td></tr>', "profil.dl\?u=(\d+)", 1)
    _ArrayDisplay($array)

    [/autoit]

    peethebee

  • danke peethebee

    aber kannst das nochmal deutlicher formulieren?

    "*" findet keinen oder mehrere Treffer
    "+" finden einen oder mehrere Treffer

    habe beides in den kleinen Script von dir versuchst

    * gibt kein Ergebniss
    + die richtige zahl
    ohne eins von beiden nur die erste Ziffer

    EDit

    also das letzte vergleicht den text "profil.dl\?u=" also kann man sagen hier guckt das Script erst und sucht dann die zahlen raus ?(

    Ich überschlaf das glaube ich lieber mal, sonst :comp2: :tongue:

    Nochmal EDit hatte gerade nen Geistesblitz

    das Pattern "profil.dl\?u=(\d+)" vergleicht praktisch nur diesen teil
    also "profil.dl\?u=" + eine Gruppe von zahlen bis zum nächsten Buchstaben, somit erhält man nur die zahlen die rechts von = sind bis zum nächsten Buchstaben oder?

    2 Mal editiert, zuletzt von Pinguin (8. November 2007 um 01:14)

  • hallo, wie vermeided man aber dann das diese zahl mit ins Raster kommt

    Code
    <td valign="top" align="right"><a class="ubild" href="profil.dl?u=12155" onmouseover="return overlib('<img src=\'userbilder/v/12155/12155-m1b0e1j1.jpg\'>');" onmouseout="return nd();"><img src="userbilder/w/12155/12155-m1b0e1j1.jpg" border="0" alt="12155-m1b0e1j1.jpg"></a>

    EDIT

    wenn ich das PAttern so mache geht es

    Code
    'www.dreamlevel.de/profil.dl\?u=(\d+)

    warum istaber dieses "\" zwischen .dl und ? so wichtig?

    habe versucht vor das Profil eben noch "/" zu schreiben, da findet er dann aber wieder gar nichts

    wie geht man da vor?

    Danke übrigens :)

    Einmal editiert, zuletzt von Pinguin (8. November 2007 um 01:26)

  • Da das ? besondere Funktionen in einem StringRegExp hat, ja nachdem an welcher Stelle es steht, du aber exakt dieses Zeichen haben willst , muss man das Zeichen "escapen". Dies geschieht eben durch den Backslash. Wenn du das Zeichen weglässt, würde das in diesem Fall bedeuten, dass das Fragezeichen jetzt dieselbe Funktion hat, wie ein {0,1}.

    Ein Fragezeichen nach einem anderen Zeichen oder einer Gruppe bedeutet, dass das vorstehenden Zeichen bzw. die Gruppe vorhanden sein KANN, aber nicht MUSS.

    Näheres dazu auch in der Hilfe.

    Bsp.:

    Code
    $var1 = "Dies ist ein Test"
    $var2 = "Dies ist kein Test"
    $var1 = StringRegExp($var1, "(Dies ist k?ein Test)"
    $var2 = StringRegExp($var2, "(Dies ist k?ein Test)"
    MsgBox(0, "Ausgabe", $var1[0] & @LF & $var2[0]

    Beide Funktionen ergeben dssselbe Ergebnis.

    Grüße,
    Buffo

    Einmal editiert, zuletzt von Buffo (8. November 2007 um 08:53)

  • so jetzt habe ich mal wieder zeit zum testeb und lernen

    If StringRegExp($lines[$y], '\d+', 0) Then
    Blup
    endif

    <== Das müsste doch eigentlich nur zahlen ausspucken?

    in der Hilfe steht
    \d Match any digit (0-9).

    da ich noch ein "+" habe muss ein Treffer sein, könner aber auch mehr sein.

    aber dennoch bekomme ich Buchstaben mit rausgefiltert

    Das hat Nichts mehr mit den Link von oben zu tun

    Beispiel wäre das

    Code
    217.115.138.93 War am 27.12.2007 Aktiv

    alles was nach der ip steht intersiert nicht, dachte ich eben filtern mir nur die zahlen erstmal raus, rest ergibt sich aber bekommst nicht hin :(

  • So gehts für IPs Am ANFANG einer Zeile:

    [autoit]

    Dim $str = @LF & "217.115.138.93 War am 27.12.2007 Aktiv"
    Dim $match = StringRegExp($str,"[\n\r](\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)",1)
    _ArrayDisplay($match)
    Exit

    [/autoit]


    Also "[\n\r](\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)" bedeutet:
    [\n\r] -> @LF oder @CR (Kann auch @CRLF sein, da das aus @ und @LF zusammengesetzt ist -> es trifft @LF)
    ( ... ) -> Treffer, der ausgegeben werden soll
    \d -> Eine Ziffer
    \d? -> Eine oder keine Ziffer
    \. -> Ein Punkt

    3 Mal editiert, zuletzt von progandy (27. Dezember 2007 um 15:31)

  • also irgendwie schaffe ich es nicht an mein Script anzupassen

    habe eine Funktion

    wobei Lines das ist
    und $datei besteht aus meheren zeile

    Code
    217.115.138.93 War am 27.12.2007 Aktiv
    217.115.138.94 War am 27.12.2007 Aktiv
    217.115.138.95 War am 27.12.2007 Noch nich eingeloggt


    müsste er doch was rausbringen er schreibt mit aber nur 0 reinO.o


    [autoit]

    FileReadToArray($Datei, $lines)
    if @error =-1 Then MsgBox(0,"Error","")
    EndIf ;Die Zahl Muss Variable Sein!
    $Zeile=IniRead( "Filter.ini", "Zeile", "Zeile", "6" );$Zeile wird aus der ini gelesen und ist indem fall 0
    For $i = 1 To UBound($lines) - 1 If StringInStr($lines[$i], 'Aktiv') <> 0 Then
    write()
    EndIf
    Next

    [/autoit][autoit]

    func write() For $y = $i - $Zeile To $i
    $output=StringRegExp($lines[$y],"[\n\r](\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)",1)
    _ArrayDisplay($output)
    ;MsgBox(64, "Found", 'Found : ' & $lines[$y])
    FileWriteLine($Ausgabe&"imail_smtp.txt", $output)
    ExitLoop
    Next
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Pinguin (27. Dezember 2007 um 16:41)

  • hast du dir mein Beispiel auch genau angeschaut?

    Zitat

    [\n\r] -> @LF oder @CR (Kann auch @CRLF sein, da das aus @ und @LF zusammengesetzt ist -> es trifft @LF)


    wenn du mit FileReadToArray einließt, befindet sich am Anfang keine umbruch. Dann kannst du \A für Stringanfang nehmen:
    \A(\d\d?\d?\.\d\d?\d?\.\d\d?\d?\.\d\d?\d?)

    2.: FileWriteLine($Ausgabe&"imail_smtp.txt", $output)
    $output ist einArray, also $output[0]
    Pro Zeile hast du ja nur aineIP am Anfang, die in $output[0] steht. Weiter IPs findet es nicht.

  • ahhh, mit Arrays kenne ich mich noch nicht so aus.
    Ich dachte der Aufbau der TXT bleibt in Array erhalten.

    Jetzt funktioniert es, da kommen wir auf den anderen Thread zurück#

    da ich jetzt array mit array vergleichen muss,,,,

    danke erstmal