kostenloser Webspace werbefrei: lima-city


VB Express - String extrahieren

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Nabend,

    ich habe mir heute überlegt, mich ein wenig mit VB zu beschäftigen. Dazu nutze ich VB Express 2010.

    So weit, so gut. Ich stehe bereits jetzt vor meinem ersten Problem und bei Google habe ich nicht direkt das gefunden, was ich suche :D

    Ich habe bisher relativ viel mit AutoIt gemacht, weshalb ich in einigen Punkten mittlerweile sehr verwöhnt bin. Da wäre u.A. die Funktion _Stringbetween.

    Ich hatte mir jetzt den Spaß gemacht und versucht, diese Funktion mit meinen nicht vorhandenen VB-Kenntnissen zu portieren:

    Public Function _StringBetween(ByVal s_String As String, ByVal s_Start As String, ByVal s_End As String, Optional ByVal v_Case As Integer = -1)
            ' Set case type
            Dim s_case = ""
            If v_Case = -1 Then s_case = "(?i)"
    
            ' Escape characters
            Dim s_pattern_escape = "(\.|\||\*|\?|\+|\(|\)|\{|\}|\[|\]|\^|\$|\\)"
            s_Start = s_Start.Replace(s_pattern_escape, "\\$1")
            s_End = s_End.Replace(s_pattern_escape, "\\$1")
    
            ' If you want data from beginning then replace blank start with beginning of string
            If s_Start = "" Then s_Start = "\A"
    
            ' If you want data from a start to an end then replace blank with end of string
            If s_End = "" Then s_End = "\z"
    
            Dim a_ret As New Regex("(?s)" & s_case & s_Start & "(.*?)" & s_End, 3)
    
            Return a_ret
        End Function


    Naja... Hätte ja klappen können (Eine Ausnahme (erste Chance) des Typs "System.InvalidCastException" ist in Microsoft.VisualBasic.dll aufgetreten.) :D Nun zur eigentlichen Frage:

    Gibt es eine ordentliche Möglichkeit, einen String zwischen zwei Strings zu extrahieren?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. m*****a

    Bin mir nicht ganz sicher, was Du meinst mit "einen String zwischen zwei Strings zu extrahieren". Aber vielleicht hilft Dir die Methode
    Substring
    weiter.

    Mehr Info gibt es unter http://openbook.galileocomputing.de/vb_net/msvb060001.htm

    Grüße
    marmota
  4. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Mit "einen String zwischen zwei Strings zu extrahieren" (in der Tat etwas blöd ausgedrückt) meine ich

    Hallo Welt, dies ist ein Test :)


    aus diesem String beispielsweise das Wort "ist" zu extrahieren, in Form von

    _StringBetween('Hallo Welt, dies ist ein Test :)', 'dies', 'ein')


    Als Ergebnis erhalte ich dann alle Vorkommnisse, die zwischen "dies" und "ein" gefunden wurden (in Form eines Arrays, anders wirds nicht gehen).

    Hoffe, dass es jetzt etwas verständlicher war :D

    Mit Substring werde ich wohl nicht all zu weit kommen, befürchte ich.

    EDIT:

    Bin mittlerweile einen Schritt weiter:

    Public Function _StringBetween(ByVal s_String As String, ByVal s_Start As String, ByVal s_End As String)
            Dim Code As String
            Code = Split(s_String, s_Start)(1)
            Code = Split(Code, s_End)(0)
    
            Return Code
        End Function


    Das erfüllt zumindest grundsätzlich meinen Bedarf, ist mir aber noch nicht "funktionell" genug.

    Beitrag zuletzt geändert: 18.5.2012 23:06:51 von fabo
  5. m*****a

    Split
    wäre jetzt auch meine nächste Idee gewesen.

    Ich weiß jetzt nicht wie gleichförmig die Strings sind, die Du auseinander nehmen möchtest. Haben die immer das selbe Trenneichen? Also z.B. ein Leerzeichen oder ein Komma? Oder können mehrere verschiedene Trennzeichen vorkommen? Ich glaube bei Split kann man auch Delimiter angeben. Keine Ahnung ob diese Delimiter in dot.net auch per RegEx angegeben werden können.

    Wenn man erstmal ein Array mit den zerlegten Strings hat, müsste es ja dann relativ simpel sein, die gesuchten Strings zu finden.
    Beispielweise:
    1. StartString, EndString an eine Methode übergeben
    2. StartString im Array suchen, Position(Index) merken
    3. EndString suchen
    4. die gesuchten Strings befinden sich zwischen StartString +1 bis EndString - 1.

    Hm. Da ich selber kein Win momentan nutze (und VB eh nicht*g*) kann ich das leider nicht selber ausprobieren :nosmile:


    Beitrag zuletzt geändert: 18.5.2012 23:19:59 von marmota
  6. Hallo fabo,

    ich würde es ja so machen:
    ' Oben einfügen:
    ' Imports System.Collections.Generic
    
    Function StringBetween(text As String, str_start As String, str_end As String) As List(Of String)
        Dim tokens As String() = text.Split({str_start}, StringSplitOptions.RemoveEmptyEntries)
    		
        StringBetween = New List(Of String)
    		
        For Each token As String In tokens
            Dim idx As Integer = token.IndexOf(str_end)
    			
            If idx >= 0 Then
                StringBetween.Add(token.Substring(0, idx))
            End If
        Next
    End Function
    Und wenn Du mehr funktionalität benötigst wirst Du wohl zwangsläufig mit RegEx arbeiten müssen.
  7. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Danke, jedoch stellt sich mir die Frage nach dem Unterschied. Okay, ich erhalte an Stelle eines Strings ein Array, aber ist das im Prinzip nicht das Selbe wie vorher nur "pompöser"? Also ich hab's jetzt so:

    Public Function _StringBetween(ByVal s_String As String, ByVal s_Start As String, ByVal s_End As String) As String
            _StringBetween = Split(s_String, s_Start)(1)
            _StringBetween = Split(_StringBetween, s_End)(0)
        End Function


    Bis auf Groß/Klein-Unterscheidung tut es ja erst einmal das, was es soll. Dass ich das mit regulären Ausdrücken nicht hin bekomme, habe ich oben bereits eindrucksvoll gezeigt :p

    Beitrag zuletzt geändert: 19.5.2012 11:26:54 von fabo
  8. Hallo fabo,

    ich habe gedacht, der Eingabetext könnte evtl. länger sein und die Start/Stop-Kombination mehrfach auftreten. Daher habe ich es so gemacht, dass er auf einmal alle Stellen heraussucht bevor man auf einem langen Text mehrfach Split aufruft.
    Deine Variante erzeugt ja auch zwei Arrays. Vermutlich wäre es mit IndexOf und Substring aber resourcenschondender einen Teilstring herauszufischen.
  9. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Achso, okay. Wieder etwas gelernt :D Danke dir :)
  10. Eine sehr gute Übersicht über die oben genannten Befehle sind auf der Seite VB@rchiv zu finden.
    Der Link dazu lautet:
    http://www.vbarchiv.net/workshop/details.php?id=88
    Dort sind im Abschnitt 2.4.7 die gängigsten Stringmanipulationen beschrieben.

    Eventuell sind auch die beide Befehle instr und like interessant:
    Die InStr-Funktion gibt die Position des ersten Zeichens einer Zeichenfolge innerhalb einer anderen Zeichenfolge zurück.
    Ein Beispiel für den Like-Operator gibt es hier: http://www.vbarchiv.net/tipps/details.php?id=1719
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!