vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Schließende klammer finden 
Autor: met
Datum: 21.10.21 21:25

Hallo, ich habe in einem string die Position einer öffnenden geschweiften Klammer.

Wie kann ich die Position der dazugehörige schließende klammer finden und alle anderen öffnenden und schließenden klammern überspringen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Schließende klammer finden 
Autor: Kuno60
Datum: 21.10.21 21:55

Hallo, ein bestimmtes Klammerpaar kann man mit Regex finden.
Ansonsten den String durchsuchen und bei allen öffnenden Klammern den Index und die Klammernummer merken. Dabei die Klammernummer hochzählen. Bei schließenden Klammern die Klammernummer runter zählen. Klammerpaare haben dann die gleiche Klammernummer.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Schließende klammer finden 
Autor: met
Datum: 22.10.21 06:47

Hallo Kuno,
so hatte ich das auch vor...

Kuno60 schrieb:
Zitat:


Ansonsten den String durchsuchen und bei allen öffnenden
Klammern den Index und die Klammernummer merken. Dabei die
Klammernummer hochzählen. Bei schließenden Klammern die
Klammernummer runter zählen. Klammerpaare haben dann die
gleiche Klammernummer.


... hatte nur gehofft, dass es evtl. schon eine fertige, schnellere Lösung gibt

Danke für die Antwort, met
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Schließende klammer finden 
Autor: Manfred X
Datum: 22.10.21 08:55

Hallo!

Irgend so etwas ...
Private Function Klammerpaarung(txt As String, pos As Integer) As Integer
 
        Dim öffnend As String = "([{"
        Dim schließend As String = ")]}"
 
        If pos < 0 Or pos > txt.Length - 2 Then Return -1
 
        Dim co As Char = txt(pos)
        Dim ind As Integer = öffnend.IndexOf(co)
        If ind = -1 Then Return -1
        Dim cc As Char = schließend(ind)
 
        Dim cnt As Integer = 1
 
        Do
            pos += 1
            If txt(pos) = co Then cnt += 1 'öffnend
            If txt(pos) = cc Then  'schließend
                cnt -= 1
                If cnt = 0 Then Return pos
            End If
        Loop While pos < txt.Length - 1
        Return -1
    End Function
Beispiel:
        Dim txt As String = "(aa{bb{cc{dd{ee}ff}gg}hh}ii)"
 
        Dim pos As Integer = Klammerpaarung(txt, 6)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Schließende klammer finden 
Autor: Kuno60
Datum: 23.10.21 14:32

Hallo met,

Zitat:

... hatte nur gehofft, dass es evtl. schon eine fertige,
schnellere Lösung gibt


wie ich schon erwähnt habe, geht es auch mit RegEx.

Const muster = "(((?'auf'\{0})[^\{0}\{1}]*)+((?'zu-auf'\{1})[^\{0}\{1}]*)+)*(?(" & _
  "auf)(?!))$"
Dim mu = String.Format(muster, "{", "}") 'Klammertyp einfügen
Dim m As Match = Regex.Match(s, mu, RegexOptions.Singleline Or _
  RegexOptions.ExplicitCapture)
For Each c In m.Groups(2).Captures.Cast(Of Capture)
  'über c die Ergebnisse abrufen
Next
Bei m.Groups(2).Captures, kann man dann die Ergebnisse abrufen, in der Reihenfolge von innen nach außen und von links nach rechts.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel