Per Regex String nach Anzahl Zeichen trennen - VB

Hallo zusammen,

ich stehe mal wieder vor einem Problem und sehe wahrscheinlich den Wald vor lauter Bäume nicht.
Wenn ich mir die Variable „Wortstrings“ per Messagebox ausgeben lasse, erhalte ich beim 2. Durchlauf der For-Schleife diese Fehlermeldungen:

Eine Ausnahme (erste Chance) des Typs "System.InvalidCastException" ist in Microsoft.VisualBasic.dll aufgetreten.
Eine Ausnahme (erste Chance) des Typs "System.ArgumentException" ist in Microsoft.VisualBasic.dll aufgetreten.

Ich überprüfe hier eine String-Variable auf ihre Länge. Sind es mehr als 30 Zeichen, so soll die Variable getrennt werden. In meinem bestimmten Fall ist die Variable 34 Zeichen lang, doch die letzten vier kommen nicht in Textbox 8, die ersten 30 aber sehr wohl in Textbox 7 hinein.

If (meineVariable.Length \> 30) Then
 Dim regMatches As MatchCollection
 regMatches = Regex.Matches(meineVariable, ".{29}")
 For y = 0 To regMatches.Count - 1
 wortstrings(y) = regMatches(y).Value
 MsgBox(wortstrings(y))
 Next y
 TextBox7.Text = wortstrings(0) 'funzt
 TextBox8.Text = wortstrings(1) 'funzt nicht
Else
 TextBox7.Text = meineVariable
End If

Ich hoffe, ich habe hier nur irgendwo etwas übersehen, was sich schnell beheben lässt.
Danke im Voraus für eure Bemühungen.

Peremptor

Hi,
damit in regMatches(1) überhaupt was drinsteht, müsste m.E. nicht nur der Teil mit den 30 Zeichen gecaptured werden, sondern auch der Rest. Ich kann aber nicht genau sagen, wie das in VB geht - nicht meine Sprache.
Dieses Muster funktioniert für Perl-RegEx:
^(.{0,30})(.*)$
Die beiden geklammerten Teile werden als Subpatterns erkannt, wobei das zweite alles enthält, was nach dem 30. Zeichen kommt.
Gruß
Thomas

Hi zurück,

danke für deine Antwort. Leider war die Experten-Auswahl nicht allzu groß…

Da es mit meiner Variable auch bei anderen Möglichkeiten der Teilung des Strings Fehler gibt, habe ich die Anfrage dieses Mal direkt ins zugehörige .Net-Forum gestellt.

Mit Perl kenne ich mich leider überhaupt nicht aus, habe aber auch schon in anderen Programmiersprachen mit Strings gearbeitet. Diesen Fehler hatte ich allerdings noch nie.
Der String wird über verschiedene Worte zusammengefügt und es scheint fast so, als wäre ein String-untypisches Zeichen darin, so dass VB den Rest einfach nicht haben will.

Falls du mal von jemandem hörst, der in irgendeiner Programmiersprache diesen logischen Fehler hat, sag bescheid, vielleicht findet sich eine Lösung :smile:

LG

Peremptore

Hallo Peremptore,

ich arbeite auch nicht mit Perl :wink:
Es ist nur so, dass die sog. „Perl-kompatiblen Regulären Ausdrücke“ (Perl-RegEx oder kurz preg) in vielen Sprachen integriert sind. Die Syntax ist auch nicht grundlegend anders, sondern nur erweitert ggü. Standard RegEx. Deine Grundanforderung besteht darin, dass du zwei Subpatterns haben möchtest - a) bis zum 30. Zeichen, b) alles was danach kommt. Runde Klammern sind Standard, um Subpatterns zu markieren. Hast du denn das vorgeschlagene Muster mal ausprobiert? Genaugenommen ist daran nix preg-spezifisch, das muss mit jeder halbwegs sinnvollen RegEx Implementierung funktionieren.
Teste mal das:
http://www.quanetic.com/Regex
Gib als Pattern ein: ^(.{0,10})(.*)$
(Zum Test nur 10 Zeichen für’s erste Subpattern, sonst ist die Ausgabe unleserlich).
Gib als Haystack ein: ABCDEFGHIJabcdef
Wähle als Typ: ereg
(das ist der „alte“ Standard)
Ergebnis sind die zwei erwarteten subpattern-Matches.
Wenn du „Haystack“ verkürzt auf weniger als 11 Zeichen, gibt’s nur ein subpattern-Match. Als Ergebnis des 2. Subpatterns wird dann 0 ausgegeben, was inhaltlich falsch ist - gemeint ist damit wohl, dass subpattern2 ein Match mit Länge 0 erzeugt.

Gruß
Thomas

Hi du,

das Problem scheint irgendwo anders zu liegen, VB hat auch ein paar andere Möglichkeiten, einen String zu zerlegen. Ich habe wohl mal wieder versucht, eine Variable zu verwenden, die ich so nicht verwenden darf.
Ich glaube, ich steige wieder auf PHP um, solche Fehler gab es da nicht *grummel*

LG

Peremptore