Quelltext auslesen mit Regex

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von TimeOut.

    Quelltext auslesen mit Regex

    Hallo,

    ich möchte gerne aus einem Quelltext diverse Inhalte auslesen und diese dann in einer Listbox ausgeben.

    Dazu habe ich mir auch schon diverse Tutorials hier im Forum durchgelesen.



    Schnipsel aus dem Quelltext:

    HTML-Quellcode

    1. <td class="inputdescription" style="width: 120px;" valign="top">Version:</td>
    2. <td class="inputdescription">&copy; DAS WILL ICH LESEN<br> SO-WIE-DAS<br>#123456<br>1234567<br> 3.04.13</td>
    3. </tr>
    4. <td class="inputdescription" style="width: 120px;" valign="top">Version:</td>
    5. <td class="inputdescription"> DAS WILL ICH LESEN<br> #123456 <br> 1234567 <br> 3.05.13</td>
    6. </table>
    7. </td></tr>





    Die Großbuchstaben, sowie die # . - sollen ausgelesen werden. Und natürlich noch die Ziffern
    Mein Code:

    VB.NET-Quellcode

    1. Dim httpRequest As HttpWebRequest = HttpWebRequest.Create("http://" & cmbIP.Text & "/")
    2. Dim httpResponse As HttpWebResponse = httpRequest.GetResponse()
    3. Dim reader As StreamReader = New StreamReader(httpResponse.GetResponseStream)
    4. Dim httpContent As String = reader.ReadToEnd
    5. Dim rx As New Regex("<td class=\""inputdescription\""(?<string>([a-zA-Z0-9.-#]+))""(.*)>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    6. Dim rxMatches As MatchCollection = TypRegEx.Matches(httpContent)
    7. For Each oMatch As Match In rxMatches
    8. ListBox1.Items.Add(oMatch.Groups("string").ToString())
    9. Next

    Nur irgendwie scheint mein Pattern nicht ganz zustimmen :/
    Ich habe es schonmal hinbekommen, aber dann hat er mir beim ersten das "&copy" immer mit angezeigt.
    Das darauf folgenede wurde gar nicht mit ausgelesen.

    Gruß
    timeout
    @TimeOut
    Hi,
    teste das mal.

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim input As String = "<td class='inputdescription' style='width: 120px;' valign='top'>Version:</td>" & _
    5. "<td class='inputdescription'>&copy; DAS WILL ICH LESEN<br> SO-WIE-DAS<br>#123456<br>1234567<br> 3.04.13</td>"
    6. For Each m As Match In New Regex("<td class=""|'inputdescription""|'>(.*?);(?<text>(.*?))<\/td>", RegexOptions.IgnoreCase).Matches(input)
    7. MessageBox.Show(m.Groups("text").Value)
    8. Next
    9. End Sub
    10. End Class


    Ist natürlich nicht perfekt und nur ein Denkanstoß.
    Wenn dir die Patterns zu groß werden kannst du sie auch teilweise zerlegen. Also in mehreren Schritten, bis du dein Ergebnis hast.

    Edit: Übrigens muss es Match.Groups("name").Value und nicht Match.Groups("name").ToString() heißen.
    Hey,

    funktioniert leider nicht.

    Ich habe mein Pattern mal abgeändert in:

    VB.NET-Quellcode

    1. Dim TypRegEx As New Regex("<td class=\""inputdescription\""\>(?<string>(.*))\<\/td\>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)

    So gibt er mir genau das aus, was ich auch haben will. Allerdings in der Form:


    &copy; DAS WILL ICH LESEN<br> SO-WIE-DAS<br>#123456<br>1234567<br> 3.04.13
    DAS WILL ICH LESEN<br> #123456 <br>1234567<br> 3.05.13

    Das untere hat im Quelltext auch das "&copy" nicht davor.
    Ich meine im Notfall kann cih auch mit den String-Methoden die <br> rausnehmen, aber ich denke man kann es auch bestimmt im Muster schon definieren
    .
    Mein obiges Beispiel habe ich nun hinbekommen. Danke ;)

    Allerdings versteh ich nicht wie ich hier:

    HTML-Quellcode

    1. <td><textarea class="textarea" name="txt_log_data" rows="50" cols="60">
    2. 0012702.504 WEB req SYS AD
    3. 0012562.200 WEB req SYS AD
    4. :</textarea></td>





    Mir nur die

    0012702.504 WEB req SYS AD
    0012562.200 WEB req SYS AD


    Daten mit RegEx auslesen kann.

    Also wie genau da der Filter aussehen muss. Entweder er liest mir gar nichts aus oder die Zahlen stehen seltsam gesplittet untereinander
    @TimeOut
    Was verstehst du denn da nicht ?
    Du musst ja eigentlich nur die class der textarea mit einbringen. Dann hast du's.

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim input As String = "<td><textarea class='textarea' name='txt_log_data' rows='50' cols='60'>" & _
    5. "0012702.504 WEB req SYS AD" & _
    6. "0012562.200 WEB req SYS AD" & _
    7. ":</textarea></td>"
    8. Dim r As New Regex("<textarea class=""|'textarea""|'(.*?)>(?<text>(.*?))<\/textarea>")
    9. For Each m As Match In r.Matches(input)
    10. MessageBox.Show(m.Groups("text").Value)
    11. Next
    12. End Sub
    13. End Class
    Viel wichtiger für dich ist der Teil

    Quellcode

    1. (?<text>(.*?))

    da hier mit "?<text>" eine Gruppe mit dem Namen "text" erstellt wird deren inhalt du mit Match.Groups("text").Value abfragen kannst. Und der Inhalt der Gruppe wir in diesem Fall über den Pattern "(.*?)" definiert. Was in diesem Fall jeglichen Text zwischen "<textarea class='...'>" und "</textarea>" beinhalted.
    Das war mir bewusst, dementsprechend habe ich meine Vergleich auch angepasst, aber anzeigen tut er mir dennoch nichts



    edit:

    habe es so in meinem Code:

    VB.NET-Quellcode

    1. Dim TypRegEx As New Regex("<textarea class=""|textarea""|(.*?)>(?<string>(.*?))<\/textarea>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    2. Dim rxMatches As MatchCollection = TypRegEx.Matches(seitenQuelltext)
    3. ListBox2.Items.Clear()
    4. For Each oMatch As Match In rxMatches
    5. ListBox1.Items.Add(oMatch.Groups("string").Value)Next


    Ein Auszug aus dem Quelltext:
    Bilder
    • regex.jpg

      171,44 kB, 1.280×851, 142 mal angesehen

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

    Du musst erfahrungsgemäß alle Zeilenumbrüche aus dem Quelltext entfernen, damit das Pattern richtig funktioniert. Oder du musst bei der Deklaration der Klasse den Parameter übergeben, dass Zeilenumbrüche nicht mit einbezogen werden.
    Bei mir ging das mit Zeilenumbrüchen nie. Also probier mal das hier, bevor du das Pattern auf den Text feuerst.

    VB.NET-Quellcode

    1. Quellcode = Quellcode.Replace(Enviroment.NewLine, "")
    Hey,



    habe es ausprobiert, leider immer noch kein Erfolg.

    Ich bin kurz vorm verzweifeln. Habe mitlerweile sämtliche Kombinationen ausprobiert, aber keine hat funktioniert..

    VB.NET-Quellcode

    1. seitenQuelltext = seitenQuelltext.Replace(Environment.NewLine, "")
    2. Dim TypRegEx As New Regex("<tr>(?<string>(.*))\<\/tr\> ", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    3. Dim TypRegEx As New Regex("\<textarea class=\""textarea\""\>(?<string>(.*))\<\/textarea\>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    4. Dim TypRegEx As New Regex("<textarea class=""|'textarea""|'(.*?)>(?<string>(.*?))<\/textarea>", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
    5. Dim rxMatches As MatchCollection = TypRegEx.Matches(seitenQuelltext)
    6. ListBox2.Items.Clear()
    7. For Each oMatch As Match In rxMatches
    8. ListBox2.Items.Add(oMatch.Groups("string").Value)
    9. 'MessageBox.Show(oMatch.Groups("string").Value)
    10. Next


    Natürlich nicht alle auf einmal.

    Nur:

    VB.NET-Quellcode

    1. Dim TypRegEx As New Regex("(?<string>(.*))", RegexOptions.Compiled Or RegexOptions.IgnoreCase)




    funktioniert, wobei er mir dann logischerweise den kompletten Inhalt des Quelltextes ausliest.

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