RegEx.Matches - search string terminieren

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets.

    RegEx.Matches - search string terminieren

    Hi,

    ich möchte aus einem HTML Dokument alle HREF="..." Strings extrahieren.

    Dazu verwende ich folgenden Search String:

    Quellcode

    1. txtRegExSearch.Text = "href="".*"""


    Mit anderen Worten: der String muss mit href=" beginnen und dann mit einem " enden.

    Dann wende ich damit RegEx.Matches an, um einen Vektor der Treffer zu erzeugen und diesen dann mit Debug.Print zeilenweise anzuzeigen:

    VB.NET-Quellcode

    1. Dim regExFound = Regex.Matches(txtData.Text, txtRegExSearch.Text, RegexOptions.IgnoreCase)
    2. Dim i As Integer = 0
    3. Debug.Print(NewLine & "Split: " & txtRegExSearch.Text & NewLine)
    4. For Each myFound In regExFound
    5. i += 1
    6. Debug.Print("Line " & i.ToString.PadLeft(5) & ": " & myFound.ToString)
    7. Next
    8. Debug.Print(NewLine & "Strings found: " & i.ToString("n0"))


    Das ist die Eingabe:

    Quellcode

    1. <link href="/wcf/images/apple-touch-icon-57x57.png?v=2">hugo ballaballla
    2. <link href="https://xmgr.de/" rel="nofollow" target="_blank" >
    3. any text ...


    Und das ist das Ergebnis:

    Quellcode

    1. Split: href=".*"
    2. Line 1: href="/wcf/images/apple-touch-icon-57x57.png?v=2"
    3. Line 2: href="https://xmgr.de/" rel="nofollow" target="_blank"
    4. Strings found: 2


    Wie man sieht, klappt das Coding ja auch prinzipiell. Aber ....

    .... aber die Suche hört nach dem " am Ende des Link nicht auf, sondern wird bis zum letzten " fortgesetzt. Deswegen ist der zweite String zu lang. Es sollte nur

    Quellcode

    1. Line 2: href="https://xmgr.de/"


    ausgegeben werden !

    Wer kennt sich in RegEx aus ? Wie kann man erreichen, dass der Match nach dem Auftreten des ersten " nach dem Link beendet wird ?

    Ich hoffe, ich habe mein Problem verständlich machen können.

    LG
    Peter

    P.S.: Einen RegEx Tester habe ich bereits .... :)

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

    Wie nicht anders zu erwarten funktioniert dein Search String ! Also erst mal recht herzlichen Dank. :)

    Jetzt würde ich halt noch gern wissen, WARUM das so ist.

    Nach meiner Referenz greift der ?-Operator wenn das VORANGEHENDE Element 0 - 1 Mal getroffen wird.

    Dann müsste das ? doch hinter dem " stehen. Also

    Quellcode

    1. txtRegExSearch.Text = "href="".*""?"


    Aber das funktioniert nicht. Es muss schon so kodiert werden, wie du das eingestellt hast ... Kannst du mir erklären warum das so ist ?

    LG
    Peter
    Grundsätzlich hast du mit der Bedeutung vom ​?-Operator recht, aber er hat noch eine zweite Bedeutung: Nach einem anderen Mengenquantifizierer (z.B. ​* oder ​+) bedeutet er, dass nicht "greedy" gematcht wird. Normalerweise ist der Matcher "greedy", d.h. er matcht so viel er kann, also auch bis zum letzten ​". Wenn er nicht-greedy ist, matcht er so wenig wie er kann - in diesem Fall also nur bis zum nächsten ​".