RegEx Probleme mit Zeilenumbruch

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Higlav.

    RegEx Probleme mit Zeilenumbruch

    Hallo

    Ich möchte mit RegEx bestimmte Sachen aus dem QuellText einer Webseite auslesen, das klappt bis jetzt auch ganz gut, bis auf ein Punkt. Der HTML Code sieht so aus:

    Quellcode

    1. <td class="fvDate"><span class="fvDayEEE">So</span> 02.03.2014</td>
    2. <td class="fvTime">12:29</td>
    3. <td class="fvEvent">
    4. Abgang Grenzstelle Aufgabeland
    5. </td>


    Das Datum und die Zeit kann ich ohne Probleme Auslesen, doch das "Abgang Grenzstelle Aufgabeland" bekomm ich nicht hin wegen den Zeilenumbrüchen. Das Ganze wird vorher so noch gefiltert:

    Quellcode

    1. Quelltext = Quelltext.Replace(" ", Nothing).Replace(vbNewLine, Nothing).Replace(vbCrLf, Nothing)


    Wie kann ich da die Zeilenumbrüche entfernen oder dies so mit RegEx auslesen?

    MFG Ebrithil
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Ansonsten würde auch das hier funktionieren:

    VB.NET-Quellcode

    1. "<td class=""fvDate""><span class="".+?"">.+?</span> (?<Date>\d{2}\.\d{2}\.\d{4})</td>(\s|\n)*?<td class=""fvTime"">(?<Time>\d{2}:\d{2})</td>(\s|\n)*?<td class=""fvEvent"">(\s|\n)*?(?<Text>.+?)(\s|\n)*?</td>"

    Dann die Gruppen Date, Time und Text abgreifen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Higlav“ ()

    @Schamash Danke, aber diesen Link habe ich auch schon gefunden, und bei mir hilf es eben nicht die vbCrLf heraus zu filtern.

    @nafets3646 Hmm, sieht nach dem aus was ich brauche, funktionier aber leider nicht. Habe das ganze so getestet:

    Quellcode

    1. Dim regex4 As New Regex("<td class="">(?<string>.*)</td>", RegexOptions.Singleline)


    @Higlav Habe ich gerade getestet, und bekomme da auch keinen Fund
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load
    Wenn überhaupt, dann musst du das so umschreiben:

    VB.NET-Quellcode

    1. Dim regex4 As New Regex("<td class="">.*?(?<string>.+?).*?</td>", RegexOptions.Singleline)

    Aber auch das könnte schief gehen, da der Punkt in der Gruppe ebenfalls Zeilenumbrüche annehmen könnte. Dann einfach ändern zu:

    VB.NET-Quellcode

    1. Dim regex4 As New Regex("<td class="">.*?(?<string>[\n]+?).*?</td>", RegexOptions.Singleline)

    ... Ich finde das nicht wirklich schön, da es für meinen Geschmack immernoch viel zu viel Freiraum für Fehler gibt.

    @Higlav Habe ich gerade getestet, und bekomme da auch keinen Fund

    Dann hast du einen Fehler gemacht: Bei mir funktionierte es wunderbar.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Higlav“ ()

    Hmm ich lade ja zuerst den Quellcode herunter, probier es mal mit dem direkten Quellcode der Webseite, dann klappt bei mir keine der Methoden.

    Edit: Link entfernt da Problem gelöst
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ebrithil“ ()

    @ebrithil es liegt am Pattern ;)

    Visual Basic-Quellcode

    1. 'String mit simulierten Zeilenumbruch
    2. Dim s As String = "<td class='fvEvent'>" &
    3. "Abgang Grenzstelle Aufgabeland" & Environment.NewLine &
    4. "</td>"
    5. MessageBox.Show(New Regex("<td(.*?)>(?<string>(.*?))<\/td>", RegexOptions.Singleline).Match(s).Groups("string").Value)


    Denk an's escapen und benutz' (.*?)
    Super!

    Quellcode

    1. Dim regex4 As New Regex("<td class=""fvEvent"">(?<string>(.*?))<\/td>", RegexOptions.Singleline)


    So funktioniert es genau so wie ich es mir erwünscht habe, danke viel mal an alle für die Hilfe.
    Mein Erstes Tutorial: Erweitertes Arduino Tutorial

    Simpler D&D FTP Uploader: Edge-Load
    Wollte nur noch anmerken: Nach ein paar Anpassungen hat auch meine Vorgehensweise hingehauen:

    VB.NET-Quellcode

    1. Dim IntSite As New Net.InternetUtility.Internetsite(New Uri("https://www.post.ch/EasyTrack/submitParcelData.do?defaultLanguage=de&formattedParcelCodes=RF205532602SG;RB903162735CN;CP924350972HK;"))
    2. Await IntSite.GetResponseAsync
    3. Await IntSite.LoadHTMLContent
    4. Dim Result As New List(Of Tuple(Of Date, TimeSpan, String))
    5. For Each m In IntSite.SourceCode.Matches("<td class=""fvDate""><span class="".+?"">.+?</span>(\s|\n)*?(?<Date>\d{2}\.\d{2}\.\d{4})(\s|\n)*?</td>(\s|\n)*?<td class=""fvTime"">(?<Time>\d{2}:\d{2})</td>(\s|\n)*?<td class=""fvEvent"">(\s|\n)*?(?<Text>[^\s].+?[^\s])(\s|\n)*?</td>")
    6. Dim DateValue = Date.Parse(m.Groups("Date").Value)
    7. Dim TimeValue = TimeSpan.Parse(m.Groups("Time").Value)
    8. Dim TextValue = m.Groups("Text").Value
    9. Result.Add(New Tuple(Of Date, TimeSpan, String)(DateValue, TimeValue, TextValue))
    10. Next

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Higlav“ ()