RegEx Anzeige-Problem

  • Hallo,

    ein kleines Problem mit RegEx.
    Es werden nicht alle Einträge gezeigt!

    Bitte diesen Text in die Zwischenablage zum Testen kopieren

    [autoit]


    Hier steht Text<option value="40">Hunde</option> Hier steht Text
    Hier steht Text<option value="19">Katzen</option>Hier steht Text
    Hier steht Text<option value="43">Vögel</option>Hier steht Text ; wird nicht angezeigt!!!

    [/autoit]


    Mein Code

    [autoit]


    #include <Array.au3>
    ClipGet()
    $sSource= ClipGet()
    $alinks = StringRegExp($sSource,'value="(\d+)"',3)
    _ArrayDisplay($alinks,"alle Nummern")

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

    $alinks2 = StringRegExp($sSource,'>(\w+)<',3)
    _ArrayDisplay($alinks2,"alle Tiere")

    [/autoit]
    Zitat

    Eine Idee woran das liegen könnte?
    Habe ein ö drin, ohne ö klappt das !!!

    Und noch ne Frage:

    Wie kann man (2 D Array?) die Werte alle anzeigen?

    [autoit]


    #include <Array.au3>
    ClipGet()
    $sSource= ClipGet()

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

    $alinks = StringRegExp($sSource,'value="(\d+)>(\w+)<',3)
    _ArrayDisplay($alinks,"alle Werte")

    [/autoit]

    das klappt leider nicht.

    Liebe Grüße
    Ilse ;)

    2 Mal editiert, zuletzt von Ilse (27. Mai 2011 um 13:44)

  • Man koennte das ueber folgenden Umweg loesen ...

    [autoit]

    #include <Array.au3>
    ClipGet()
    $sSource = ClipGet()
    Select
    Case @error = 0
    $sSource1 = StringRegExpReplace($sSource, "[üÜ]", "ue")
    $sSource2 = StringRegExpReplace($sSource1, "[öÖ]", "oe")
    $sSource3 = StringRegExpReplace($sSource2, "[äÄ]", "ae")
    EndSelect
    $alinks = StringRegExp($sSource3,'value="(\d+)"',3)
    _ArrayDisplay($alinks,"alle Nummern")

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

    $alinks2 = StringRegExp($sSource3,'>(\w+)<',3)
    _ArrayDisplay($alinks2,"alle Tiere")

    [/autoit][autoit][/autoit][autoit][/autoit]
  • Hallo hightower,

    merci für den Tipp.
    Weißt du auch wie man alle Werte in dem Array anzeigen lassen kann?

    Ich meine daß ich einen RegEx Befehl habe

    [autoit]


    $alinks = StringRegExp($sSource,'"(\d+)">(\w+)<',3)

    [/autoit]

    Das Ergebnis sollte so aussehen:
    $Hunde = "40"
    $Katzen = "19"


    Grüße
    Ilse ;)

    2 Mal editiert, zuletzt von Ilse (26. Mai 2011 um 13:35)

  • Ist zwar nicht selbst gemachtes RegEx aber es funktioniert auch hehe:

    Spoiler anzeigen
    [autoit]


    #include <String.au3>
    $sSource= ClipGet()
    $array = StringSplit($sSource,@CR,2)

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

    For $wert In $array
    $zwischen = _StringBetween($wert,'<option value="','</option>')
    $end = StringSplit($zwischen[0],'">',2)
    $final = "$" & $end[2] & ' = "' & $end[0] & '"'
    MsgBox(0,"",$final)
    Next

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

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hallo Chip,

    grüße dich. War in Urlaub...
    Ich kann glaube ich nochmal von vorne Anfangen 8)

    hm.. dein Script zeigt den Error Subscript used with non-Array variable.:

    Aber folgendes:
    Ich möchte es unbedingt mit RegEx machen.
    Muß viel mit Quelltexten machen und habe mich deßhalb
    auch schon sehr viel mit RegEx beschäftigt. Ich finde RegEx super und sehr mächtig
    wenn man Texte bearbeiten muß.

    Ich stolpere halt immer wieder über die Arrays.
    Kannst du mir vielleicht ein RegEx Beispiel machen?

    [autoit]


    #include <String.au3>
    #include <Array.au3>
    $sSource= ClipGet()
    $array = StringSplit($sSource,@CR,2)

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

    For $wert In $array
    $zwischen = _StringBetween($wert,'<option value="','</option>')
    $end = StringSplit($zwischen[0],'">',2)
    $final = "$" & $end[2] & ' = "' & $end[0] & '"'
    MsgBox(0,"",$final)
    Next

    [/autoit]

    Liebe Grüße
    Ilse ;)

  • versuch es mal so:

    [autoit]

    #include <Array.au3>
    ClipGet()
    $sSource= ClipGet()
    $alinks = StringRegExp($sSource,'value="([^"]*)">([^<]*)',3)
    $atest = StringRegExp($sSource,'value="([^"]*)',3)
    _arraydisplay($alinks,"ergebnis")
    _arraydisplay($atest,"test")

    [/autoit]

    viel spaß damit...

  • Hallo Kra88,

    erstmal merci, das mit RegEx ist ok.
    Ich muß aber die Werte zusammen erhalten.
    Deine Liste sieht z.B. so aus:

    [autoit]


    40
    Hunde
    19
    Katzen
    43
    Vögel

    [/autoit]

    Es sollte aber alles in einer Zeile sein
    also so:

    [autoit]


    40 Hunde
    19 Katzen
    43 Vögel

    [/autoit]

    und das Endergebnis muß umgewandelt werden, also so:

    [autoit]


    $Hunde = "40"
    $Katzen = "19"
    $Vögel = "43"

    [/autoit]

    da muß ich irgendwie hinkommen.
    Genau das ist das Problem

    Liebe Grüße
    Ilse ;)

  • so vielleicht;

    [autoit]

    #include <Array.au3>
    ClipGet()
    $sSource= ClipGet()
    $ahunde = StringRegExp($sSource,'value="([^"]*)">Hunde',3)
    $akatze = StringRegExp($sSource,'value="([^"]*)">Katzen',3)
    $avoegel = StringRegExp($sSource,'value="([^"]*)">Vögel',3)
    $atest = StringRegExp($sSource,'value="([^"]*)',3)
    _arraydisplay($ahunde,"Hunde")
    _arraydisplay($akatze,"katzen")
    _arraydisplay($avoegel,"Vögel")

    [/autoit]

    ansonsten sagen was du genau machen willst...

    was dein ganzen script machen soll bzw. dein projekt

  • Hallo kra88,

    bin froh daß du dich wieder meldest.
    Das war's leider auch nicht.

    Ich erkläre das ganze nochmal Schritt für Schritt

    1. Es gibt einen Quelltext der ungefähr so aussieht (Zwischenablage)

    Spoiler anzeigen


    Hier steht Text ; Hier steht Text ; Hier steht Text ; Hier steht Text ;
    Hier steht Text<option value="40">Hunde</option> Hier steht Text
    Hier steht Text<option value="19">Katzen</option>Hier steht Text
    Hier steht Text<option value="43">Vögel</option>Hier steht Text ;
    Hier steht Text ; Hier steht Text ; Hier steht Text ; Hier steht Text ;


    2. Diese Werte muß ich später in eine Textdatei (Editfeld) scheiben
    das Editfeld sollte am Ende (nach der RegEx-Bearbeitung) dann so aussehen:

    Spoiler anzeigen


    $Hunde = "40"
    $Katzen = "19"
    $Vögel = "43"

    Der Weg:
    Ich koiere den Quelltext in die Zwischenablage!
    Ich benutze RegEx um die Nummern und Namen zu erhalten. Das klappt ja!
    Das Problem ist: Wie kann ich die Werte in das Editfeld schreiben
    und zwar Zeilenweise?
    Die Frage wäre: Wie konvertiere ich den Quelltext (Zwischenablage) zu diesem Ergebnis:

    Spoiler anzeigen


    $Hunde = "40"
    $Katzen = "19"
    $Vögel = "43"

    Ich starte das Script und das kommt dabei heraus!
    Ich hoffe ich habe es einigermaßen erklären können.

    Das ist der Regex Code (ohne das Ergebnis...)

    Spoiler anzeigen


    #include <Array.au3>
    ClipGet()
    $sSource= ClipGet()
    $ahunde = StringRegExp($sSource,'value="([^"]*)">Hunde',3)
    $akatze = StringRegExp($sSource,'value="([^"]*)">Katzen',3)
    $avoegel = StringRegExp($sSource,'value="([^"]*)">Vögel',3)
    $atest = StringRegExp($sSource,'value="([^"]*)',3)
    _arraydisplay($ahunde,"Hunde")
    _arraydisplay($akatze,"katzen")
    _arraydisplay($avoegel,"Vögel")


    Viele Grüße
    Ilse ;)

    Einmal editiert, zuletzt von Ilse (26. Mai 2011 um 21:43)

  • Nabend,
    vielleicht hilft dir mein "Ansatz", der vllt schon eine kleine Problemlösungsabdeckung besitzt:

    Spoiler anzeigen
    [autoit]

    #include <array.au3>

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

    $string = 'Hier steht Text ; Hier steht Text ; Hier steht Text ; Hier steht Text ;' & @CRLF & _
    'Hier steht Text<option value="40">Hunde</option> Hier steht Text' & @CRLF & _
    'Hier steht Text<option value="19">Katzen</option>Hier steht Text' & @CRLF & _
    'Hier steht Text<option value="43">Vögel</option>Hier steht Text ;' & @CRLF & _
    'Hier steht Text ; Hier steht Text ; Hier steht Text ; Hier steht Text ; '

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

    $filter = StringRegExpReplace($string, '.+<.+="(\d*)">([^<]*)<.+', "$$2 = ""$1""" & @CRLF)

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

    $arrayfilter = StringRegExp($string, '.+<.+="(\d*)">([^<]*)<.+', 3)

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

    _ArrayDisplay($arrayfilter, "Array Auswertung") ; diese ergebnisse werden gefiltert durch das muster

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

    MsgBox(0, "Filterung - unschön", $filter) ; falls du hiermit was anfangen kannst - muster ist nicht perfekt

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

    ;Lösung 1 via Arraysuche
    $index = _ArraySearch($arrayfilter, "Hunde") ; die arrayvariante
    If $index <> -1 Then
    MsgBox(0, $arrayfilter[$index], $arrayfilter[$index - 1])
    EndIf

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

    ;Lösung 2 via Stringsuche
    MsgBox(0, "Hunde", anzahlTiere("Hunde", $filter)) ; hier die stringsuche für die stringregexpreplace variante

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

    Func anzahlTiere($sTier, $sText) ; Sucht zu dem Begriff die angefügte Anzahl, andernfalls -1
    $aText = StringSplit(StringStripCR($sText), @LF)
    For $i = 1 To $aText[0]
    $position = StringInStr($aText[$i], "$" & $sTier & " = ")
    If $position <> 0 Then
    $position += StringLen("$" & $sTier & " = ") + 1
    Return StringMid($aText[$i], $position, StringLen($aText[$i]) - $position)
    EndIf

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

    Next
    Return -1
    EndFunc ;==>anzahlTiere
    ;Ergebnis (Lösung 1 und Lösung 2 sind hier analog zu verwenden)
    $Hunde = anzahlTiere("Hunde",$filter)
    If $Hunde <> -1 Then MsgBox(0,"Anzahl Hunde","Offenbar sind genau " & $Hunde & " Hunde gefunden worden!")

    [/autoit]

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Oder einfach so?

    Spoiler anzeigen
    [autoit]

    Local $sText, $aArray, $sString
    $sText = _
    'Hier steht Text<option value="40">Hunde</option> Hier steht Text' & @CRLF & _
    'Hier steht Text<option value="19">Katzen</option>Hier steht Text' & @CRLF & _
    'Hier steht Text<option value="43">Vögel</option>Hier steht Text ; wird nicht angezeigt!!!' & @CRLF

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

    $aArray = StringRegExp($sText, _
    '\Q<option value="\E' & _ ; sucht '<option value="'
    '(\d+)' & _ ; dann nur zahlen ( -> ins Array aufnehmen )
    '\Q">\E' & _ ; jetzt '">'
    '([^<]+)' & _ ; dann alles bis zum < ( -> ins Array )
    '\Q</option>\E' _ ; und wieder '</option>' als Abschluss
    , 3)

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

    For $i = 0 To UBound($aArray) - 1 Step 2
    $sString &= '$' & $aArray[$i + 1] & ' = "' & $aArray[$i] & '"' & @CRLF
    Next

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

    MsgBox(0,"",$sString)

    [/autoit]

    Die StringRegExp Zeile lässt sich natürlich auch auf eine Zeile verkürzen.. hab das nur der kommentierung halber gemacht.

    MfG

  • ich hoffe es ist jetzt so wie du willst:

    [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1_1 = GUICreate("Form1", 328, 384, 192, 124)
    $ed_quelle = GUICtrlCreateEdit("", 32, 56, 257, 97)
    GUICtrlSetData(-1, "")
    $lbl_quelle = GUICtrlCreateLabel("Quellcode:", 40, 24, 55, 17)
    $ed_ergebnis = GUICtrlCreateEdit("", 32, 200, 257, 105)
    GUICtrlSetData(-1, "")
    $lbl_erg = GUICtrlCreateLabel("Ergebnis:", 32, 168, 48, 17)
    $bt_start = GUICtrlCreateButton("Start", 32, 344, 97, 25)
    $bt_zwisch = GUICtrlCreateButton("von Zwischenablage in die Box", 104, 24, 161, 17)
    $txt_pfad = GUICtrlCreateInput("test.txt", 32, 312, 257, 21)
    $bt_laden = GUICtrlCreateButton("Lade Datei", 136, 344, 81, 25)
    $bt_oeffnen = GUICtrlCreateButton("Datei öffnen", 224, 344, 65, 25)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    ;GUICtrlSetData ($ed_quelle,'Hier steht Text<option value="40">Hunde</option>'& @CRLF ,0)
    ;GUICtrlSetData ($ed_quelle,'Hier steht Text<option value="19">Katzen</option>'& @CRLF,0)
    ;GUICtrlSetData ($ed_quelle,'Hier steht Text<option value="43">Vögel</option>Hier steht Text'& @CRLF,0)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $bt_start
    _start()
    case $bt_zwisch
    _zwischen()
    case $bt_laden
    _laden()
    case $bt_oeffnen
    _dateioeffnen()
    EndSwitch
    WEnd

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

    func _start()
    $aquelle =GUICtrlRead($ed_quelle)
    $ahunde = StringRegExp($aquelle,'value="([^"]*)">Hunde',3)
    $akatze = StringRegExp($aquelle,'value="([^"]*)">Katzen',3)
    $avoegel = StringRegExp($aquelle,'value="([^"]*)">Vögel',3)
    GUICtrlSetData ($ed_ergebnis,'$Hunde = "'& $ahunde[0]&'"' & @CRLF,0)
    GUICtrlSetData ($ed_ergebnis,'$Katze = "'& $akatze[0]&'"' & @CRLF,0)
    GUICtrlSetData ($ed_ergebnis,'$Vögel = "'& $avoegel[0]&'"' & @CRLF,0)
    EndFunc

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

    func _zwischen()
    $aquelle= ClipGet()
    GUICtrlSetData ($ed_quelle,"")
    GUICtrlSetData ($ed_quelle,$aquelle,0)
    EndFunc

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

    func _laden()
    $file = FileRead(GUICtrlRead($txt_pfad))
    GUICtrlSetData($ed_quelle,$file)
    FileClose($file)
    MsgBox(64,"Fertig","Datei eingelesen")
    EndFunc

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

    func _dateioeffnen()
    $_FILE_OpenDialog = FileOpenDialog("Wähle eine TextDatei aus!", "", "(*.txt)")
    If @error Then
    MsgBox(0, "Error", "Keine Datei ausgewählt!")
    Return 0
    EndIf
    $_FILE_ReadFile = FileRead($_FILE_OpenDialog)
    GUICtrlSetData($ed_quelle, $_FILE_ReadFile)
    EndFunc

    [/autoit]
  • Guten Morgen zusammen,

    als erstes habe ich mich heute Morgen
    riesig über eure Beiträge gefreut.

    Klappt jetzt alles prima.

    Aber ich hätte noch eine Frage an Seubo
    (einfach nur damit ich es verstehe)
    Frage1 RegEx

    Spoiler anzeigen


    Diesen RegEx Befehl hatte ich bisher noch nicht verwendet!
    Wofür steht \Q und \E?
    '\Q<option value="\E'

    Heißt das, muß man mit \Q die Suche einleiten und mit \E abschliesen?
    Ich hätte das so probiert '<option\s\w+'


    Frage2 Loop

    Spoiler anzeigen


    Wieso läuft dein Loop in zweierschritten durch?
    For $i = 0 To UBound($aArray) - 1 Step 2

    Hier nochmal der Code v. Seubo

    Spoiler anzeigen


    Local $sText, $aArray, $sString
    $sText = _
    'Hier steht Text<option value="40">Hunde</option> Hier steht Text' & @CRLF & _
    'Hier steht Text<option value="19">Katzen</option>Hier steht Text' & @CRLF & _
    'Hier steht Text<option value="43">Vögel</option>Hier steht Text ; wird nicht angezeigt!!!' & @CRLF

    $aArray = StringRegExp($sText, _
    '\Q<option value="\E' & _ ; sucht '<option value="'
    '(\d+)' & _ ; dann nur zahlen ( -> ins Array aufnehmen )
    '\Q">\E' & _ ; jetzt '">'
    '([^<]+)' & _ ; dann alles bis zum < ( -> ins Array )
    '\Q</option>\E' _ ; und wieder '</option>' als Abschluss
    , 3)

    For $i = 0 To UBound($aArray) - 1 Step 2
    $sString &= '$' & $aArray[$i + 1] & ' = "' & $aArray[$i] & '"' & @CRLF
    Next

    MsgBox(0,"",$sString)


    Nochmal ein ganz dickes Lob an alle Helfer

    Liebe Grüße
    Ilse ;)

  • @ Ilse

    mit welchem Code haste jetzt dein problem gelöst?

    ich verlinke mal auf das Regex tutorial von seubo; hier

    hier ein auzug aus dem Tutorial:

    Zitat

    Alles was zwischen \Q und \E steht, wird auch genauso gesucht. Die "Funktionen" der Metazeichen werden also nicht aktiv.
    Allerdings ist das normale escapen i.d.R. einfacher, schneller und überischtlicher.

    das ergebnis von:

    [autoit]

    _ArrayDisplay($aArray)

    [/autoit]

    ist:

    Code
    [0]|40
    [1]|Hunde
    [2]|19
    [3]|Katzen
    [4]|43
    [5]|Vögel

    mit der schleife fügt fügt er die Arrayelemnte sozusammen, wie du sie haben wolltest...

    er fängt bei 0 an schreibt zuerst "$" dann "Element $i +1" vom array und das entspricht "Hund" zusätzlcih hängt er er die zahl an von element $i in demfall die 40 an...

    beim next erhöt sich der wert $i um 1... mit dem step 2 springt er dann gleich zur nächsten zahl (19)

    ich hoffe da war verständlich...

    ps: für _arraydisplay ist

    [autoit]

    #include <Array.au3>

    [/autoit]

    notwendig...

  • Hallo Kra88,

    merci für deine Erklärung. Alles verstanden..!
    Ich konnte das Problem mit jedem Beispiel lösen.
    Super und Danke nochmal!

    Bis zum nächsten mal

    Grüße
    Ilse ;)