Announcement

Collapse
No announcement yet.

Strings zwischen zwei unterschiedlichen Strings finden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Strings zwischen zwei unterschiedlichen Strings finden

    Hallo Forum,

    peinlich, peinlich (in Perl war das so einfach) - ich habe mich das ganze Wochenende damit beschäftigt und keine Lösung gefunden:

    Es wird der Quelltext einer Webseite in einen String eingelesen.
    In diesem String sollen alle vorkommenden Strings in einem Array gespeichert werden welche sich zwischen Anfang [_blocked_div">] und Ende [ <small>] befinden. Von den gesuchten Strings weiß man nur, dass sie vorhanden sind, jewweils einmalig sind und eben zwischen Anfang und Ende stehen. Aber NICHT wie sie lauten, wie lange sie sind, ob leerzeichen vorkommen. Sie können auch öfter in einer Zeile vorkommen.

    Habe mir split, Mid und Instr angesehen und experimentiert, aber bekomme es einfach nicht hin.

    Hat jemand die Muße mir ein Beispiel zu posten? Es geht nur darum diese Strings zu finden, ah und die Schleife, damit er nach dem ersten Treffer nicht in die nächste Zeile springt sonder in gleicher Zeile nach einem weiteren Vorkommen sucht.

    Vielen Dank, Alex
    Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
    Entwicklungsumgebung: Visual Basic 2008 Pro

  • #2
    Das Stichwort dafür ist "Reguläre Ausdrucke". In .NET insbesondere über die Regex Klasse zu behandeln.
    Für ein Beispiel in diesem Forum guckst du hier.

    Comment


    • #3
      Hallo und Danke für den Tip.

      Leider habe ich es immer noch nicht gelöst.

      Meinen Regex-Ausdruck habe ich, denke ich... ;-)

      (?<=_blocked_div"">)(.+)(?= <small>)

      Nur die Schleife bekomme ich nicht hin. Das Beispiel im obigen Link bringt mich auch nicht weiter, da es scheinbar für nur einen Treffer gabaut ist.

      Mein Plan ist in etwa folgender:

      For Each mach in RegEX(String, "(?<=_blocked_div"">)(.+)(?= <small>)")
      ReDim Preserve ergebnis(+1) = mach
      Next

      Das dieser code völlig falsch ist, ist mir klar, er soll nur mein vorhaben erklären.

      kann mir da jemand unter die arme greifen?

      Danke, alex
      Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
      Entwicklungsumgebung: Visual Basic 2008 Pro

      Comment


      • #4
        Auch das mit der Schleife ist in dem verlinkten Thread zu finden.
        Regex.Matches liefert dir eine Collection von Treffern über die du mit einem foreach iterieren kannst.

        Comment


        • #5
          Hallo Zusammen, besonders Ralf,

          habe die letzen Tage dann doch eingesehen, dass man sich wohl nicht "mal auf die Schnelle" Vb.Net beibringen kann - aber eben doch schon a bisserl was gelernt. ;-)

          Zum aktuellen Thema:
          Eine Hilfestllung bräucht ich nun noch: Mein RegExp findet die erste Anfangsmarke und trifft (frißt) alles bis zu letzten Endmarke. So entstehen leider keine Einzeltreffer. Kann nochmal jemand helfen, bitte?

          Hier das Ergebnis meiner bißherigen Bastelei:
          Code:
          Imports System.Collections.Generic
          Imports System.Text.RegularExpressions
          Public Class Form1
              'Programmablauf ;-)
              Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                  Dim link As String = "http://apacs.de/test/test.html"
                  Dim quelltext As String = DownloadWebpage(link)
                  Dim ergebnis As IEnumerable(Of String) = RegexSplit(quelltext)
                  For Each i As String In ergebnis
                      TextBox1.Text &= i & Environment.NewLine
                  Next
              End Sub
              'Quelltext von Webseite aus Internet als String zurückgeben
              Public Function DownloadWebpage(ByVal URL As String) As String
                  Dim IoStream As System.IO.Stream
                  Dim StrRead As System.IO.StreamReader
                  Try
                      Dim Request As System.Net.WebRequest = System.Net.WebRequest.Create(URL)
                      IoStream = Request.GetResponse.GetResponseStream
                      StrRead = New System.IO.StreamReader(IoStream)
                      Return StrRead.ReadToEnd
                  Catch ex As Exception
                      Return vbNullString
                  Finally
                      StrRead.Close()
                      IoStream.Close()
                  End Try
              End Function
              'Die einzelnen Treffer als Collection zurückgeben
              Public Function RegexSplit(ByVal input As String) As IEnumerable(Of String)
                  Dim matches As MatchCollection = Regex.Matches(input, "(?<=_blocked_div"">)(.+)(?= <small>)")
                  Dim result As New List(Of String)(matches.Count)
                  For Each m As Match In matches
                      result.Add(m.Value)
                  Next
                  Return result
              End Function
          End Class
          Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
          Entwicklungsumgebung: Visual Basic 2008 Pro

          Comment


          • #6
            Gelöst:

            Diese Foren verleiten immer weider dazu schneller zu fragen als auszuprobieren.

            Für alle die auch mal über sowas stolpern und diesen Thread finden, hier die Zusammenfassung:

            Regulärer Ausdruck um einen unbekannten String zwischen zwei definierten Strings zu finden. Hier im Beispiel soll aus einem Webseitenquelltext alle Treffer gefunden werden die zwischen _blocked_div"> und <small> stehen, also:
            _blocked_div">Treffer <small>:
            (?<=_blocked_div"">)(.+?)(?= <small>)
            (In der ersten Klammer escaped das erste " das " im Suchbegriff. Das Fragezwichen in der Mitte (welches zur letzten Frage geführt hat) sorgt dafür, dass Einzeltreffer entstehen und nicht alles zwischen erster Anfangsmarke und letzter Endmarke gefunden wird.)

            Hier zum Ausprobieren:
            Wir haben eine Form1. Bei click auf Button1 werden die einzelnen Treffer Zeile für Zeile in TextBox1 ausgegeben:
            Code:
            Imports System.Collections.Generic
            Imports System.Text.RegularExpressions
            Public Class Form1
                'Programmablauf ;-)
                Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
                    Dim link As String = "http://apacs.de/test/test.html"
                    Dim quelltext As String = DownloadWebpage(link)
                    Dim ergebnis As IEnumerable(Of String) = RegexSplit(quelltext)
                    For Each i As String In ergebnis
                        TextBox1.Text &= i & Environment.NewLine
                    Next
                End Sub
                'Quelltext von Webseite aus Internet als String zurückgeben
                Public Function DownloadWebpage(ByVal URL As String) As String
                    Dim IoStream As System.IO.Stream
                    Dim StrRead As System.IO.StreamReader
                    Try
                        Dim Request As System.Net.WebRequest = System.Net.WebRequest.Create(URL)
                        IoStream = Request.GetResponse.GetResponseStream
                        StrRead = New System.IO.StreamReader(IoStream)
                        Return StrRead.ReadToEnd
                    Catch ex As Exception
                        Return vbNullString
                    Finally
                        StrRead.Close()
                        IoStream.Close()
                    End Try
                End Function
                'Die einzelnen Treffer als Collection zurückgeben
                Public Function RegexSplit(ByVal input As String) As IEnumerable(Of String)
                    Dim matches As MatchCollection = Regex.Matches(input, "(?<=_blocked_div"">)(.+?)(?= <small>)")
                    Dim result As New List(Of String)(matches.Count)
                    For Each m As Match In matches
                        result.Add(m.Value)
                    Next
                    Return result
                End Function
            End Class
            Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
            Entwicklungsumgebung: Visual Basic 2008 Pro

            Comment


            • #7
              Danke. Ist immer gern gesehen wenn Leute die ihr Problem gelöst haben ihre Lösung auch zeigen.

              Comment


              • #8
                Anzumerken ist noch dass das beschriebene Problem auftrat weil Regular Expressions als "gierig" gelten. Es wird also wenn es mehrere Treffermöglichkeiten gibt per Default immer die längste gefunden. Will man dass umgehen muss man eben mit den speziell dafür vorgesehenen Operatoren dafür sorgen dass zum Beispiel immer das erste gefunden wird.

                Weitere Infos hier: Reguläre Ausdrücke im .NET Framework
                Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                Comment

                Working...
                X