Frage zu Regex



  • Hallo zusammen ich will eine URL parsen und dort nach einem speziellen Link parsen.
    Ich würde das sehr gerne mit regulären Expressions machen.
    Her ein Beispiel, was gesucht werden soll :

    <a href="index.php?id=299" onfocus="blurLink(this);">Daten</a>
    

    Kann mir jemand helfen.
    Mein bisheriger Versuch :

    <a(.?)>(.?)Daten</a>

    Allerdings liefert mir dieser Ausdruck einen String zurück, der mit einem Link anfängt und mit

    Daten</a>

    endet. Aberer beinhaltet auch alle links, die davor liegen

    Vielen Dank



  • Hi,

    kannst du etwas von deinem Quellcode, den Inhalt, auf den du die Regex anwendest und das Ergebnis zeigen? Dann kann man dir gezielter helfen!



  • Wenn im Zeichenspezifizierer steht, er soll alle zeichen nehmen, tut er das auch. Du musst also auch die kombination, die das ende markiert, ausschließen.



  • Genau das ist das Problem. Hier mein Versuch "<" zeichen zu ignorieren :

    <a(.?)>(.?)(?!<)Data</a>



  • roflo schrieb:

    Wenn im Zeichenspezifizierer steht, er soll alle zeichen nehmen, tut er das auch. Du musst also auch die kombination, die das ende markiert, ausschließen.

    Wie meinen?
    Genau dafür ist non-greedy doch da. 😕

    Ich weiß nicht ob das das Problem ist, aber du musst den Vorwärtsslash definitiv escapen.
    Ansonsten kann ich das Problem nicht nachvollziehen, gib mal etwas Code und ein Sample.



  • Das ist meine aktuelel Version :

    (<a){1,1}(.*)?>Data<\/a>
    

    Ich bekomme weiterhin einen String mit dem ersten gefunden Link und bis zum "Data" Link

    Habe bisher noch keine java code - probiere die Reg ex gerade auf der kommandozeile aus



  • Kommandozeile? Inwiefern? Ich vermute stark dass da irgendwas schiefgeht, nicht an dem Regex selber.
    Und was soll das mit "{1,1}", das bringt doch nichts.

    Gib mal ein minimal Sample von Regex sowie Input, und sag genau was bei dir rauskommt.



  • Naja ich test das mit grep auf der command line



  • Verstehe, dann werden wir den Fehler wohl haben:

    grep -P -o "<a(.*?)>(.*?)Daten<\/a>" test.txt
    

    Rufst du es so auf?
    Grep unterstützt per default keine non greedy modifier. Hat aber rein gar nix mit Java zu tun.



  • Nächster Versuch um alle Links vor dem geuchten Link zu ignorieren :

    <a(.*?)href=(.+?)>(?!href)(.*)Data<\/a>
    


  • Wozu, hast du meine letzt Antwort gelesen? Gehts mit Java statt grep?
    Überall gehts, nur mit grep nicht. ._.



  • DarkShadow44 schrieb:

    roflo schrieb:

    Wenn im Zeichenspezifizierer steht, er soll alle zeichen nehmen, tut er das auch. Du musst also auch die kombination, die das ende markiert, ausschließen.

    Wie meinen?
    Genau dafür ist non-greedy doch da

    In der Tat, hab den OP wohl zu schnell gelesen. Für GNU grep sollte eigentlich mit -P das greedy ? unterstützen.
    Edit:
    Folgendes funktioniert:

    echo "<a href="index.php?id=299" onfocus="blurLink(this);">Daten</a>" | grep -Po "(?<=<a\s).*?(?=>Daten</a>)"
    

    Gibt

    href="index.php?id=299" onfocus="blurLink(this);"
    

    aus.



  • Danke für die ganzen Antworten.
    Ich habe allerdings etwas vergessen.
    Der zu durchsuchende String sieht folgendermaßen aus :

    <a href="index.php?id=290" onfocus="blurLink(this);">BlaBlub1</a><a href="index.php?id=291" onfocus="blurLink(this);">Daten</a><a href="index.php?id=292" onfocus="blurLink(this);">BlaBlub2</a>
    <a href="index.php?id=293" onfocus="blurLink(this);">BlaBlub3</a>
    

    Ich möchte nun den String

    <a href="index.php?id=299" onfocus="blurLink(this);">Daten</a>
    

    parsen und dann den link

    index.php?id=299
    

    extrahieren.

    Kann mir da jemand noch mal helfen



  • Ich habe nun selber eine Lösung gefunden :

    <a\s?href\s?=\s?[\'|\"](\w+.){1,4}[\'|\"]\s?\w+..\w+.\w+..[\'|\"].Ergebnisdienst
    

    Vielelicht ist sie nicht optimal aber sie funktioniert.



  • Ich habe es jetzt noch einmal optimiert :

    (<a\s["':a-zA-Z()_%&\.\?=0-9;]+(\s["':a-zA-Z()_%&\.\?=0-9;]+)?>\b)\w+Data
    

    Nun möchte ich im nächsten Schritt nach einem SubString im Link suchen. Es sollen nur links gefunden werden, die auf klasse oder liga enden : z.B Bundesliga oder Kreisklasse

    Mein erster Versuch :

    (<a\s["':a-zA-Z()_%&\.\?=0-9;]+(\s["':a-zA-Z()_%&\.\?=0-9;]+)?>\b)\w+[klasse|liga]
    

    Allerdings liedert diese suche auch andere Links. Nun meine Frage wie kann man in einem regulären Ausruck nach unterschiedlichen Substrings suchen.

    Vielen Dank


Log in to reply