Brauche Hilfe zu StringRegExp (Neu)

  • Hallo,
    hab ein kleines Problem :)


    AutoIt
    $iresult = StringRegExp($iquellcode1, '<div class="blablablabla" blablablabla"blablablabla('blablablabla');">blablablabla</div>', 3)

    Im Pattern ist jetzt " und ' wie kann ich das jetzt in Anführungzeichen setzen?

    • Offizieller Beitrag

    Hallo,

    einfach die Anführungszeichen im String verdoppeln!

    AutoIt
    $iresult = StringRegExp($iquellcode1, '<div class="blablablabla" blablablabla"blablablabla(''blablablabla'');">blablablabla</div>', 3)

    Steht in der Hilfe unter Language Reference - Datatypes Abschnitt Strings

  • danke
    Habe eine weitere frage zu StringRegEXP
    Hab jetzt als zum prüfendem String:


    Will jetzt nur die zahl von der ID= und die will ich nur dann wenn am ende "text/bild1" ist
    Hab es schon so versucht aber geht leider nicht :(

    AutoIt
    Stringregexp($string,'\Q<div class="blabla" id="blabla_blabla_\E(\d+)\Q" style="\E\Q"><img src="text/bild1\E',3)


    AutoIt
    Stringregexp($string,'\Q<div class="blabla" id="blabla_blabla_\E(\d+)\Q" style="\E[ ... ]\Q"><img src="text/bild1\E',3)

    Einmal editiert, zuletzt von blackcho (5. Juni 2015 um 11:28)

  • Moin!

    Wenn der String immer so aussieht, wie oben, gehts ganz einfach:

    AutoIt
    #include <Array.au3>
    
    
    $html = ClipGet()
    $aIDs = StringRegExp($html, 'id="(.+)" .+src="text/bild1.+"', 3)
    If IsArray($aIDs) Then
    	_ArrayDisplay($aIDs)
    Else
    	MsgBox(0, "Nix", "Nichts gefunden!")
    EndIf

    Der Einfachheit halber muss sich der obige String in der Zwischenablage befinden...

  • Danke hast mir wirklich sehr weitergeholfen.
    Hab mir Gestern mehrere Tutorials mehrmals durchgelesen um selber eine Lösung zufinden doch hab es einfach nicht geschafft Danke.

  • Eigentlich wollte @blackcho ja nur die Zahl hinter der "ID=" haben...

    Wenn ich das so mit Notepad++ teste, funktioniert es auch mit IDs, die mehr als zweistellig sind... mit AutoIt aber leider nicht... verstehe nicht, warum.

    Beisp.: <div class="blabla" id="blabla_blabla_999744" style="z-index:1001;width:70px;height:46px;background:url(text/datei1.png) no-repeat;position:absolute;left:1415px;top:622px;"><img src="text/bild1_3.png" style="position:relative;bottom:3px;"></div>


    PS: Der Editor ist ja mal so was von extrem lahm, da verliert man ja die Lust, überhaupt irgendwas auf AutoIt.de zu schreiben!

  • hinter das erste .* noch ein ?

    Das funktioniert auch nicht...

    ...das liefert mir auch nur "44" und nicht wie erwartet/erwünscht "999744".

  • du hast ja auch mehr im Pattern verändert als ich gesagt habe.
    Folgendes Pattern richtet es:'id=".*?(\d+)".+src="text/bild1.+"'

    Und folgendes sollte stabiler sein:

    Code
    (?s)id="[^"]*?(\d+)"(?:.(?!<div))+src="text/bild1[^"]+"

    Einmal editiert, zuletzt von AspirinJunkie (7. Juni 2015 um 13:45)

  • Vielen Dank!

    So funktioniert es nun auch:

    AutoIt
    $aIDs = StringRegExp($html, 'id=".*?([0-9]+)".+src="text/bild1.+"', 3)


    "(\d+)" ist ergo die verkürzte Form von "([0-9]+)"

  • Moin!

    Falls die ID immer gleich aufgebaut ist, lässt sich das Ganze noch weiter vereinfachen, was auch theoretisch etwas schneller sein sollte, weil weniger überprüft werden muss.

    Voraussetzung für Aufbau der ID: "irgendwas_irgendwas_nummer", also muss man nur das "fangen", was zwischen dem zweiten Unterstrich und den Anführungszeichen ist.

    AutoIt
    $aIDs = StringRegExp($html, 'id=".*_(.+)" .+src="text/bild1.+"', 3)


  • Hi!

    Keine Ahnung, was du da machst, aber folgender Code:

    AutoIt
    #include <Array.au3>
    
    
    $html = ClipGet()
    $aIDs = StringRegExp($html, 'id=".*_(.+)" .+src="text/bild1.+"', 3)
    If IsArray($aIDs) Then
    	_ArrayDisplay($aIDs)
    Else
    	MsgBox(0, "Nix", "Nichts gefunden!")
    EndIf

    führt zu folgendem Ergebnis:

    [Blockierte Grafik: http://i.imgur.com/GTBi4bg.png]

    Immer vorausgesetzt natürlich, dass sich der komplette Beispieltext in der Zwischenablage befindet...

    • Offizieller Beitrag

    Falls die ID immer gleich aufgebaut ist, lässt sich das Ganze noch weiter vereinfachen, was auch theoretisch etwas schneller sein sollte, weil weniger überprüft werden muss.

    Nur mal zur Info,
    id=".*_(.+)" .+src="text/bild1.+" benötigt 1532 Schritte bis die ID gefunden wird und id=".*?(\d+)".+src="text/bild1.+" nur 220 Schritte, ist also rund 7 mal schneller!

  • Nur mal zur Info,id=".*_(.+)" .+src="text/bild1.+" benötigt 1532 Schritte bis die ID gefunden wird und id=".*?(\d+)".+src="text/bild1.+" nur 220 Schritte, ist also rund 7 mal schneller!

    Ich entschuldige ich mich für die falsche Info!
    Danke für die Korrektur. Jetzt hab ich gesehn, dass das Programm "Regex Buddy" auch eine Debug-Funktion hat. Sehr aufschlussreich.
    Ich hätte zB gedacht, dass (.+) schneller ist, als (\d+), weil nicht nach speziellen Typen gesucht, sondern einfach alles gefangen wird, aber offensichtlich ist genau der umgekehrte Fall zutreffend...

    *edit*
    AspirinJunkie: z.B. die Debug Funktion von Regex Buddy

    • Offizieller Beitrag

    Gibts da irgendein Tool welches die Anzahl der Schritte ausgibt?

    Ich habe es auch mit RegexBuddy gemacht, man kann sich aber z. B. den kostenlosen Regex Coach herunterladen, der hat eine Step-Funktion, damit kann man zumindest schrittweise beobachten wie der Pattern arbeitet.

    • Offizieller Beitrag

    den kostenlosen Regex Coach

    Im Gegensatz zum RegexBuddy erkennt der Coach nicht alles, was in AutoIt-RegEx gematcht wird.
    Bsp.:
    Erkennung ob in einem String ein 4-buchstabiges Palindrom enthalten ist. Wird erkannt vom RegexBuddy und AutoIt, nicht vom Coach.

    AutoIt
    $s1 = 'anna'
    $s2 = 'marianna'
    ConsoleWrite(StringRegExp($s1, '(.)(.)\2\1') & @CRLF)
    ConsoleWrite(StringRegExp($s2, '(.)(.)\2\1') & @CRLF)


    Edit: Ich sehe gerade, der Grund ist ein anderer. Der Coach bearbeitet nicht automatisch mehrzeilige Eingaben. Den Modus muss man erst setzen, da bin ich vom Buddy etwas verwöhnt. :whistling: