RegEx - verschachtelten Div-Container auslesen

  • VB.NET
  • .NET 6

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    RegEx - verschachtelten Div-Container auslesen

    Servus,

    ich versuche gerade aus einer Textdatei u.a. einen verschachtelten Div-Container auszulesen.
    Der Beispieltext:
    Spoiler anzeigen
    ></div></div>
    <div class="single_article"><h1 class="article_details_h2">Systemanforderung</h1><div class="feature_group"><div>
    <div class="left">Kompatible Betriebssysteme</div><div class="right">Windows 98SE/ME/2000/XP/2003/Vista/7 Mac OS 10.4</div></div></div>
    </div><div class="single_article"><h1 class="article_details_h2">Anschlüsse und Schnittstellen</h1><div class="feature_group">
    <div><div class="left">Anzahl Anschlüsse</div><div class="right">13</div></div><div>
    <div class="left">Hub-Schnittstellen</div><div class="right">USB 2.0</div></div><div>
    <div class="left">Anzahl USB 2.0 Anschlüsse</div><div class="right">13</div>
    <div class="left">DC-Anschluss</div><div class="right"><div class="icon_button_ok"></div></div></div></div></div>
    <div class="single_article"><h1 class="article_details_h2">Verpackungsdaten</h1><div class="feature_group"><div>
    <div class="left">Verpackungsbreite</div><div class="right">143 mm</div></div><div>
    <div class="left">Verpackungstiefe</div><div class="right">230 mm</div></div><div>
    <div class="left">Verpackungshöhe</div><div class="right">70 mm</div></div><div>
    <div class="left">Paketgewicht</div><div class="right">290 g</div></div></div></div>
    <div class="left">Datenübertragungsrate</div><div class="right">480 Mbit/s</div></div><div>
    <div class="left">Produktfarbe</div><div class="right">Schwarz</div></div><div>
    <div class="left">LED-Anzeigen</div><div class="right">Status</div></div><div>
    <div class="left">Kabellänge</div><div class="right">0,75 m</div></div><div>
    <div class="left">Plug &;amp; Play</div><div class="right"><div class="icon_button_ok"></div></div></div><div>
    <div class="left">Zertifizierung</div><div class="right">CE, RoHS</div></div></div></div><div class="single_article"><h1 class="article_details_h2">Lieferumfang</h1><div class="feature_group"><div>
    <div class="left">AC-Netzadapter</div><div class="right"><div class="icon_button_ok"></div></div></div></div></div><div class="single_article"><h1 class="article_details_h2">Sonstige Funktionen</h1><div class="feature_group"><div>
    <div class="left">Mac-Kompatibilität</div><div class="right"><div class="icon_button_ok"></div></div></div><div>
    <div class="left">MAC-Adressentabelle</div><div class="right">127 Eintragungen</div></div></div></div></div>


    Dabei hab ich ein MatchCollection für

    Quellcode

    1. div class="left"
    und einmal ein MatchCollection für

    Quellcode

    1. div class="right"


    soweit so gut. jetzt habe ich aber das Problem, das bei div class= "right" noch ein div-container ist:
    Spoiler anzeigen
    <div class="left">Mac-Kompatibilität</div><div class="right"><div class="icon_button_ok">


    wenn ich nun mein Regex um <>="_ erweitere, spuckt er mir den kompletten oberen Text als einzigen Match aus:

    VB.NET-Quellcode

    1. Dim RegExLeft As RegularExpressions.MatchCollection
    2. Dim RegExRight As RegularExpressions.MatchCollection
    3. Dim RegEx As RegularExpressions.Regex
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. ReadData()
    6. End Sub
    7. Sub ReadData()
    8. Dim txt As String = Translate(System.IO.File.ReadAllText("B:\JSON- Daten\100008.json"))
    9. txt = txt.Substring(txt.IndexOf("productFeatures"), txt.IndexOf("addToCartLink") - txt.IndexOf("productFeatures") - 3)
    10. Dim LeftAndRight As String = ""
    11. RegExLeft = RegularExpressions.Regex.Matches(txt, "<div class=" & Chr(34) & "left" & Chr(34) & ">[\w\s" & Chr(34) & "\=<>_\-/,\.äöüÄÖÜ&]+</div>")
    12. RegExRight = RegularExpressions.Regex.Matches(txt, "<div class=" & Chr(34) & "right" & Chr(34) & ">[\w\s" & Chr(34) & "\=<>_\-/,\.äöüÄÖÜ&]+</div>")
    13. For i As Integer = 0 To RegExLeft.Count - 1
    14. LeftAndRight &= RegExLeft(i).Value & ":" & RegExRight(i).Value & ";"
    15. Next
    16. TextBox1.Text = LeftAndRight


    was ich nicht verstehe, ich frage ja mit den Pattern bis </div> ab. Ich denke, das problem liegt hier, das wenn man das Pattern anschaut, sich hierbei auch der String </div> ergibt und er es somit gar nicht wahrnimmt.
    Kleiner, allgemeiner Tipp (falls du es noch nicht kanntest, ich finde es sehr nützlich): Unter regex101.com/ kannst du direkt live sehen, was dein regulärer Ausdruck macht, sogar mit Beschreibungtext. Zudem kann man den sich dort zusammenklicken. Evtl. hilft das. Vorher musst du vermutlich dort den "Flavor" auf ".NET" umstellen.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    trix0 schrieb:

    einen verschachtelten Div-Container auszulesen
    Verschachtelung kann Regex nicht.
    Es ist nur eine Grammatik zweiter Ordnung, um Verschachtelungen auflösen zu können, müsste es dritter Ordnung sein (hab ich mal gehört, was aber 'Ordnung' konkret bedeutet hatte ich damals nicht verstanden).

    Vermutlich fährst du mit XDocument oder olle XmlDocument besser, oder installierst dir gar über nuget ein html-packet.