Eigentlich ganz simpler regulärer Ausdruck

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Eigentlich ganz simpler regulärer Ausdruck

    Wollte ersteinmal ein freundliches Hallo in die Runde werfen, ich bin neu hier
    Es wäre toll, wenn Ihr mir bei meinem kleinen Anfänger-Problem helfen könntet...

    Es geht darum, dass ich gerne einen Schlüssel in einem Text finden möchte:

    Der zu durchforstende String könnte beispielsweise so aussehen:
    "_xxx__e__xx__e__xx__e"

    Nun soll, in laienhaften Worten ausgedrückt, folgendes Muster erkannt werden:

    - Zweimal x, dann
    - fünfmal die Zeichen _,x oder e, wobei e nur einmal vorkommen darf!
    - wieder zweimal x
    - wieder die fünf Zeichen _,x oder e, wobei e nur einmal vorkommen darf
    - und zu guter letzt wieder zweimal x


    Ich möchte mit obiger Anweisung unter anderem folgende Muster aufspüren:
    xx__e__xx__e__xx oder
    xx_e___xx_e___xx und so weiter

    Ich habe folgenden Ausdruck probiert, wobei der bei meinem Teststring leider kein Ergebnis liefert:

    PHP-Code:
    $suchmuster[0]="/xx([_x]*e[_x]*){5}xx([_x]*e[_x]*){5}xx/";
    $teststring "______e_xx___e_xxx__e__xx__e__xx__e______e";

    preg_match ($suchmuster[0],$teststring,$founds);
    echo 
    "<pre>";
    print_r($founds);
    echo 
    "<pre>"
    Tausend Dank für Eure Antworten, Ihr seid meine letzte Hoffnung, ich weiß absolut keinen Rat mehr...

    Viele Grüße

  • #2
    sehr seltsame zeichenfolge. wo kommt sie eigentlich her?

    hint: schreibe eine liste von validen und invaliden zeichenketten in mehreren zeilen und teste deinen ausdruck mit http://pcre.nophia.de/evaluate/index.php

    Kommentar


    • #3
      Re: Eigentlich ganz simpler regulärer Ausdruck

      naja,

      so simple scheint mir die sache nicht.

      mein vorschlag:
      - du suchst dir im ersten durchgang alle strings raus, die mit xx beginnen und enden und es in der mitte haben, dazwischen sollten dann jeweils die fünf zeichen stehen
      - hast du so einen teilstring, splittest du am xx und schaust, ob die teile dawischen nur ein e enthalten

      scheint mir der weg des geringsten widerstandes zu sein ...

      wenn du das alles in einen regexp quetschen willst - was wohl möglich wäre - machst du dich tot.
      Die Zeit hat ihre Kinder längst gefressen

      Kommentar


      • #4
        Re: Re: Eigentlich ganz simpler regulärer Ausdruck

        ok, ich hab da mal was programmiert:

        PHP-Code:
        <?php
        $suchmuster
        ="/xx([_xe]{5})xx([_xe]{5})xx/";
        $teststring "______e_xx___e_x_x__e_xxx__e__x___e______e";

        $founds1="";
        $founds2="";

        preg_match ($suchmuster,$teststring,$founds); // Die jeweils fünf Zeichen zwischen den drei xx´en finden
        // Wenn welche gefunden, weitersuchen:
        if (count ($founds)==3){
        preg_match ("/[_x]*(e)[_x]*/",$founds[1],$founds1); // Schauen, ob genau ein "e" im ersten Callback ist
        preg_match ("/[_x]*(e)[_x]*/",$founds[2],$founds2);// Schauen, ob genau ein "e" im zweiten Callback ist
        }

        echo 
        "<pre>";
        print_r($founds);
        echo 
        "<pre>";

        echo 
        "<pre>";
        print_r($founds1);
        echo 
        "<pre>";

        echo 
        "<pre>";
        print_r($founds2);
        echo 
        "<pre>";

        ?>
        das scheint sogar ganz zuverlässig zu funktionieren. allerdings hätte ich im schlimmsten fall dann gleich DREI regexp´s, die ich ausführen müsste.
        ich muss aber leider sehr auf die performance achten, weil das skript ziemlich häufig (mehrmals pro sekunde) ausgeführt wird, und ich noch viele weitere suchmuster durchlaufen lassen muss.
        Außerdem find ichs schrecklich umständlich...

        Deswegen wäre mir ehrlich gesagt eine Lösung rein mit regexp´s am liebsten.
        Ich habe auch das Gefühl, als wäre ich der Lösung (bei meinem ursprünglichen Ansatz, siehe oben) ganz nahe. Anscheinend klappt es nicht, dass bei
        PHP-Code:
        ([_x]*e[_x]*){5
        wirklich nur genau 5 Zeichen in der Klammer sind....

        Kann man oder muss man es nicht anders schreiben, dass [_x]*e[_x]* genau 5 Zeichen sind!?

        Kommentar

        Lädt...
        X