Regex - letzes Vorkommen eines Bereichs suchen

  • Allgemein

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Eddy.

    Regex - letzes Vorkommen eines Bereichs suchen

    Ich stehe gerade echt auf dem Schlauch...

    wie muss ich die Regex gestalten, dass nur das letzte Vorkommen von <a href="WASICHSUCHE" gematched wird? Ich kriegs nicht hin, dass es nicht schon beim ersten <a href=" beginnt. Ausserdem soll nur gemached werden, wenn der Link vor class="next" steht, also ein "nächste Seite" Link vorhanden ist.

    Ich habe versucht die Regex <a href="(?<NEXTPAGE>.*?)" class="next" anzupassen, stand aber anscheinend noch nicht vor einem ähnlichen Problem...

    Hier der Beispieltext:

    Quellcode

    1. wp-paginate"><li><span class="title">Seiten:</span></li><li><a href="http://blabla.com/sumsum/page/1/" class="prev">&laquo;</a></li><li><a href='http://blabla.com/sumsum/' title='1' class='page'>1</a></li><li><span class='page current'>2</span></li><li><a href='http://blabla.com/sumsum/page/3/' title='3' class='page'>3</a></li><li><a href='http://blabla.com/sumsum/page/4/' title='4' class='page'>4</a></li><li><a href="http://blabla.com/sumsum/page/3/" class="next"

    Du kannst die RegexOption.RightToLeft nutzen, dann wird von hinten an gesucht.

    VB.NET-Quellcode

    1. Sub Search()
    2. Dim str As String = "wp-paginate""><li><span class=""title"">Seiten:</span></li><li><a href=""http://blabla.com/sumsum/page/1/"" class=""prev"">&laquo;</a></li><li><a href='http://blabla.com/sumsum/' title='1' class='page'>1</a></li><li><span class='page current'>2</span></li><li><a href='http://blabla.com/sumsum/page/3/' title='3' class='page'>3</a></li><li><a href='http://blabla.com/sumsum/page/4/' title='4' class='page'>4</a></li><li><a href=""http://blabla.com/sumsum/page/3/"" class=""next"">text</a>"
    3. Dim reg As New Regex("(?<=<a href="")(.*?)(?="".*?class=""next"")", RegexOptions.RightToLeft Or RegexOptions.IgnoreCase)
    4. Dim mat As Match = reg.Match(str)
    5. If mat.Success Then
    6. Debug.WriteLine(mat.Value)
    7. End If
    8. End Sub


    Edit:

    @DanCooper hatte nochmal editiert.
    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eddy“ ()

    Danke, mit RegexOptions.RightToLeft funktioniert es soweit mit meiner Regex <a href="(?<NEXTPAGE>.*?)" class="next".

    Deine Lösung verstehe ich jedoch nicht ganz:

    1. wieso eine so komplizierte Regex?
    2. wieso hast du >text</a> am Ende angefügt, obwohl das in meinem String fehlt? Ich könnte die vorherige Regex zwar anpassen, so dass das im String auch noch drin ist, aber das war eigentlich nicht meine Ausgangslage...

    3. funktioniert deine Regex nur in vb.NET?
    Die Webseite regex101.com gibt folgende Fehler an:
    * A quantifier inside a lookbehind makes it non-fixed width
    ? The preceding token is not quantifiable

    Die Website debuggex.com/r/oFMM5nZj4FlJAZQi matched gar nix (soweit ich das sehe)

    Edit: das Ergebnis der Regex sollte http://blabla.com/sumsum/page/3/, falls das bei meiner Fragestellung nicht klar ist ;)
    1. Schreib ich immer so, finde ich nicht kompliziert, sogar gut lesbar. Linke() was links neben dem gesuchten steht(nicht im output) abgesehen ?<= damit das bekannt ist dasses links davon steht und nicht in den output soll, mittlere() alles fuer die Ausgabe, rechte() was rechts neben dem gesuchten steht(nicht im output) abgesehen ?= dasselbe analog zu links nur halt fuer ende. Oh man bloed erklaert :rolleyes:

    2. >text</a> war nur fuer einen Test. Kann Ignoriert werden, vergessen wieder zu entfernen.

    3 Muesste auch in C# funktionieren, aber in unterschiedlichen Sprachen ist regex AFAIK etwas anders,

    Dein Edit: das hatte ich noch bemerkt, daher mein Edit.
    And i think to myself... what a wonderfuL World!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Eddy“ ()

    1. Stimmt, jetzt kapiers ich auch den Syntax ?<= und ?= (Google hilft) :)
    3. Ich teste meistens mit regex101.com, da dort Ergebnisse und Fehler sehr schön angezeigt werden. debuggex.com zeigt dafür grafisch sehr gut an, was die Regex wirklich macht. Nach deinem Edit funktioniert die Regex nun auch auf beiden Seiten.

    Dein Edit: hab ich nach meinem Edit nicht bemerkt ;)

    Vielen Dank und schönen Abend!