Wieder mal Regex

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von newbie.

    Wieder mal Regex

    Hallo zusammen,

    ich habe ein Problem mit Regex.

    Und zwar,

    warum funktioniert das hier:

    VB.NET-Quellcode

    1. Titel = Regex.Match(RichTextBox1.Text, "<title>(.*)?</title>").Groups(1).Value


    Ergebnis: "Die Homepage"
    Es wird genau das ausgegeben, was ich möchte. Die Zeichen bzw. der String zwischen den Tags <title>Die Homepage</title>

    So, das ist noch nicht das Problem.
    Es gibt eie Tabelle auf der Seite, was aus einer DB gefüllt wird.

    Warum funktioniert das hier nicht:

    VB.NET-Quellcode

    1. Titel = Regex.Match(RichTextBox1.Text, "<tr class=""odd"">(.*)?</tr>").Groups(1).Value


    Da Ergebnis bleibt leer.
    Kann mir jemand ein Tip geben bitte, ich brauche die Teilabschnitte, weil die sich wiederholen (<tr class="even"> und <tr class="odd">), je nach Datensatz.
    Aus dem Teilabschnitt möchte ich dann die einzelnen Tags bzw Daten rausnehmen und in einem ListView anzeigen.

    HTML-Quellcode

    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    2. <html>
    3. <head>
    4. <title>Die Homepage</title>
    5. <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
    6. .
    7. .
    8. .
    9. <table class="standard">
    10. <tr class="even">
    11. <td height="20" width="25%" bgcolor="#575757" class="res_text2">
    12. <strong>Ware</strong>
    13. </td>
    14. <td width="25%" bgcolor="#575757" class="res_text2">
    15. <strong>Preis</strong>
    16. </td>
    17. <td width="10%" bgcolor="#575757" class="res_text2">
    18. <div style="text-align: center;"><strong>verk.</strong></div>
    19. </td>
    20. <td width="20%" bgcolor="#575757" class="res_text2">
    21. <div style="text-align: center;"><strong>Lieferdatum</strong></div>
    22. </td>
    23. </tr>
    24. <tr class="odd">
    25. <td height="20">
    26. 885
    27. Dies und das
    28. </td>
    29. <td>576 €</td>
    30. <td>
    31. <div style="text-align: center;">
    32. <img src="images/classic/icons/lager.png">
    33. </div>
    34. </td>
    35. <td>
    36. <div style="text-align: center;">
    37. <img src="images/classic/icons/ausverkauft.png">
    38. </div>
    39. </td>
    40. <td>
    41. <div style="text-align: center;">
    42. -
    43. </div>
    44. </td>
    45. <td>
    46. <div style="text-align: center;">
    47. -
    48. </div>
    49. </td>
    50. <td>
    51. <div style="text-align: center;">
    52. <a href="xxx.php">
    53. <img border="0" src="images/classic/icons/cross.png">
    54. </a>
    55. </div>
    56. </td>
    57. </tr>


    Danke
    Hallo nochmal,

    bin jetzt auf etwas gestoßen, aber immernoch kein Erfolg

    VB.NET-Quellcode

    1. Dim abschnitt As String
    2. Dim pattern As String = "<tr class=\""odd\"">(?.*)\<\/tr>"
    3. abschnitt = Regex.Match(quelltext, pattern, RegexOptions.Singleline).Groups(1).Value


    "RegexOptions.Singleline" = Zeilenumbrüche ignorieren, oder hab ich da was falsch verstanden?

    Der HTML-Code wie oben aus.
    Die Inhalte der <tr> -Tags sind über mehrere Zeilen lang.

    Kann mir denn keiner helfen?

    Danke

    %P% schrieb:

    Kleiner Tipp:

    VB.NET-Quellcode

    1. Quellcode = RegEx.Replace(Quellcode, "\n", "", RegExOptions.None)
    Danke für den Tipp.

    Jetzt habe ich zwar ein Ergebnis, die ist leider immernoch nicht das was ich mir erhofft habe.

    VB.NET-Quellcode

    1. <tr class=\""odd\"">(?<string>.*)<\/tr>


    Das sollte doch eigentlich von ... bis liefern. Ich bekomme alles bis zum letzten </tr> dabei sollte doch nur der Inhalt bis zum ersten </tr> ausgegeben werden.
    Kann mir bitte einer noch ein Tipp geben?^^

    MfG
    newbie
    Uff. Ich interessiere mich immer mehr für RegEx, aber ganz ehrlich.. Ich finde, dass das hier wirklich eine schöne frage ist (letztes problem).
    Warum wird alles bis zum letztem Tr ausgegeben? - Wundert mich eigentlich nicht, da man bestimmt etwas besonderes braucht, was dein gesuchtes end Tr auszeichnet. Beispiel: ein <div class="end" style="display:none;"></div> tag von </tr>, damit dein regex weiß, aha! Das ist mein gesuchtes Tr.
    Nehme ich mal an, ich bin aber nicht so erfahren in RegEx....
    hmm..

    hier geht es doch auch: Dodo's Tread



    powachill schrieb:

    Beispiel: ein <div class="end" style="display:none;"></div> tag von </tr>


    ...hab ich auch schon probiert. Es ist ja nicht so, dass ich hier sofort um hilfe bitte ohne mir vorher den Kopf zu zerbrechen.
    Bin VB6 Umsteiger, dabei habe ich mit VB6 2005 lediglich meine Techniker Abschlussarbeit geschrieben, ansonsten auch nicht wirklich viel mit gemacht.
    Regex ist ganz neu jetzt.


    MfG
    newbie
    alles eine Sache der RegexOptions ;) ... mit IgnoreCase und Multiline brauchst du keine NewLines rausfiltern und kriegst jedes Ergebnis. Im RegexPattern musst du einfach das </tr> nicht erlauben. Somit gehts nur bis zu der Stelle ;)
    Danke für die Antwort, wie könnte ich das nicht Erlauben? Ein Beispiel wäre nett.

    Ich habe es eben gerade geschafft.

    So sieht der richtige Pattern/Regex aus:

    VB.NET-Quellcode

    1. Dim trRegex As New Regex("<tr class=\""odd\"">(?<string>.*?)<\/tr>")
    2. Dim mytr As String = trRegex.Match(quelle).Groups("string").ToString()


    Es lag die ganze Zeit an dem fehlenden ? nach dem *
    Ich verstehe es zwar nicht wirklich, aber bin Froh, dass es endlich nach zwei Tagen Sucherei nun funktioniert.

    Meine Quelle zum Erfolg: hier

    MfG und danke für die Unterstützung
    (??) bestimmt eine Gruppe
    (?<>?) zwischen den <> steht der Name und danach folgt das Pattern welches alles in diese Gruppe aufgeführt wird
    (?<title>.*?) steht für alles
    wenn wir eine Zeichenfolge nicht haben wollen dann benutzen wir folgendes:
    (?<title>(?<=<\/tr>)?)

    Quelle : wikipedia

    Nächste Frage/Problem

    Habe meine Aufgabe fast gelöst, wie der Titel es schon sagt: "Wieder mal RegEx".

    Also folgendes Problem habe ich.
    Ich bekomme mittlerweile die Bereiche ausgegeben die ich brauche natürlich mit RegEx, nur noch diese eine Stelle haut nicht ganz hin:

    HTML-Quellcode

    1. <td height="20"> Zahl Einheit Ware </td> <td>865 €</td> <td> <div style="text-align: center;"> usw...


    mit dem folgendem pattern

    VB.NET-Quellcode

    1. pattern = "td height=\""20\"">\s*(?<zahl>[^<\s]*)\s(?<einh>[^<\s]*)\s*(?<ware>[^<?]*)"


    sieht das Ergebnis so aus

    "Zahl Einheit Ware tab tab "|bis zum schließen des td-Tags

    Das soll veranschaulichen, dass am Ende des Strings noch Leerzeichen als Tabs noch mitgeschnitten werden.
    ich brauche den pattern auch etwa so, weil es auch vorkommen kann, dass keine Einheit angegeben ist (also leer) und die Ware besteht immer aus mehreren Wörtern
    .

    Wenn ich es so schreibe

    VB.NET-Quellcode

    1. pattern = "td height=\""20\"">\s*(?<zahl>[^<\s]*)\s(?<einh>[^<\s]*)\s*(?<ware>[^<\s]*)"

    bekomme ich nur das erste Wort von Ware

    und so

    VB.NET-Quellcode

    1. pattern = "td height=\""20\"">\s*(?<zahl>[^<\s]*)\s(?<einh>[^<\s]*)\s*(?<ware>[^<\s]*.*)"


    "Zahl Einheit Ware tab tab </td> <td>865 €</td> <td> <div style="text-align: center;"> usw..."

    Ich habe zwar wirklich sehr viel ausprobiert und viel gelesen, aber ich bekomme es einfach nicht hin, den String so aussehen zu lassen:

    "Zahl Einheit Ware"

    Kann mir bitte mal einer oder mehrere unter die Arme greifen?^^
    Ich hoffe es ist klar was ich überhaupt von euch möchte ?


    Danke

    String.Trim() entfernt führende und nachstehende Leerzeichen sowie Tabzeichen
    String.Split(" "c, SplitOptions.IgnoreEmptyEntries) splittet beim Leerzeichen und sorgt dafür dass aus "Ich bin ein Beispieltext" das wird {"Ich", "bin", "ein", "Beispieltext"} diese StringArray kannst du wieder mit
    String.Join(" "c, StringArray) zusammen fügen mit nur einem Leerzeichen dazwischen.

    im Regex gibt es ein Identifier fürs Stringende ich glaube das ist $. Evtl. hilft es bei dem ^[:blank:]
    Danke Mangafreak1995,

    so einfach...
    schon viele Codebeispiele gesehen/gelesen, aber nie eine Verwendung für "Trim" gehabt.^^

    Es klappt, aber nicht im RegEx-Pattern

    VB.NET-Quellcode

    1. Dim zahl As String
    2. Dim einh As String
    3. Dim ware As String
    4. Dim pattern As String = "td height=\""20\"">\s*(?<zahl>[^<\s]*)\s(?<einh>[^<\s]*)\s*(?<ware>[^<?]*)
    5. zahl = Regex.Match(RichTextBox1.Text, pattern).Groups(1).Value
    6. einh = Regex.Match(RichTextBox1.Text, pattern).Groups(2).Value
    7. ware = Regex.Match(RichTextBox1.Text, pattern).Groups(3).Value
    8. RichTextBox1.Text = "Zahl: " & zahl & " Einheit: " & einh & " Ware: " & ware.TrimEnd


    Ich kann auf jeden Fall damit schonmal meine Aufgabe erledigen.
    Mich würde es trotzdem interessieren, wie man das im Pattern schreibt.

    Danke vielmals