Forum: PC-Programmierung (VB.net) RegEx nur matchen wenn N Zeichen


von aaronew (Gast)


Lesenswert?

Hallo Community,

ich habe ein Gerät per Com Port angeschlossen, und möchte von diesem 
Daten einlesen.

Um nicht benötigte Daten rauszufiltern, nutze ich RegEx: Ich will nur 
Datenpakete einlesen, die mit Hex AA beginnen und mit Hex FF enden.

Das funktioniert mit folgendem Code auch, allerdings sendet das Gerät 
auch "leere" Pakete: "AA-00-FF", immer zwischen den "vollen" Paketen.

Mein Problem:
Ich will daher mit RegEx nur Datenpakete matchen, die zwischen dem 
Anfang (AA) und dem Ende (FF) mindestens 6 weitere Zeichen haben. Genau 
das bekomme ich nicht hin.

Ich hab verschiedene RegEx Commands ausprobiert, aber ohne Erfolg 
bisher.

Mein Code sieht aktuell so aus, mit dem wird auch auch AA-00-FF 
eingelesen.
1
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
2
3
4
        Dim readexst As String = SerialPort1.ReadExisting
5
        Dim filtr As Regex = New Regex("(?<=\xAA).*(?=\xFF)")
6
        Dim mtch As Match = filtr.Match(readexst)
7
8
        If mtch.Success Then txtOrgStr.Text = mtch.Value 
9
10
'stellt die Daten korrekt da
11
        Dim hexString As String = txtOrgStr.Text
12
        Dim arry As Byte() = Encoding.GetEncoding("ISO-8859-1").GetBytes(hexString)
13
        txtnew.Text &= BitConverter.ToString(arry)

Kann mir jemand sagen wie ich den RegEx Befehl entsprechend umschreiben 
muss, damit zwischen AA und FF nur gematched wird, wenn mindestens 6 
Zeichen dazwischen sind?

Danke schonmal für eure Hilfe

von Schleimfasten (Gast)


Lesenswert?

aaronew schrieb:
> Hallo Community,

> Kann mir jemand sagen wie ich den RegEx Befehl entsprechend umschreiben
> muss, damit zwischen AA und FF nur gematched wird, wenn mindestens 6
> Zeichen dazwischen sind?
Ich kenne VB nicht was die für einen regexp Style verwenden.
Aber üblich ist die Angabe per {n,m}:

Bsp:
\d{6,6}

matched mind. 6 Ziffern.

von Kaj (Gast)


Lesenswert?

"(?<=\xAA).{6}(?=\xFF)"

von Schleimfasten (Gast)


Lesenswert?

Äh "mindestens" ist hier falsch. Es matched exakt 6 Ziffern.

n ist der mindestwert, lässt man ihn weg kann auch auch gar nicht dort 
stehen
m maximal Anzahl

Bsp:
\d{,10}   : Bis zu 10 Ziffern
\d{1,20}  : mind 1, höchstens 20

von Retrofan (Gast)


Lesenswert?

Kaj schrieb:
> "(?<=\xAA).{6}(?=\xFF)"

das ist exakt 6 mal.

"(?<=\xAA).{6,}(?=\xFF)"

das ist mindestens 6 mal, auch gerne mehr. -> .{6,}

von aaronew (Gast)


Lesenswert?

Vielen Dank Leute!

Retrofan schrieb:
> {6,}

so funktioniert es, wie ich es haben wollte.

Bloß wird nun in der Textbox jede Zeile mehrfach dargestellt.

Sprich, Gerät sendet "AA-11-22-33-44-55-FF" nur einmal -> in der Textbox 
erscheint es mindestens fünf mal, bevor es die nächsten Pakete 
anzeigt...das war vorher nicht.

von c-hater (Gast)


Lesenswert?

aaronew schrieb:

> Bloß wird nun in der Textbox jede Zeile mehrfach dargestellt.

Dann musst du halt dein Programm korrigieren.

von Retrofan (Gast)


Lesenswert?

Naja, der Punkt (.) steht ja für ein beliebiges Zeichen.
Somit werden auch die Bindestriche mit einbezogen.
Das müßtest du dann genauer spezifizieren.

Eine Hexzahl könnte man etwa so umschreiben : [a-fA-F0-9]{2}
Dann müßten noch die Bindestriche mit beachtet werden.

Kenne mich jetzt nicht mit der VB-Syntax aus.

von Retrofan (Gast)


Lesenswert?

so könnte es gehen :
1
"AA(~-[a-fA-F0-9]{2}){6,}~-FF"

Wenn mind. 6 Hexzahlen zwischen AA und FF stehen sollen.
Andernfalls die {6,} entsprechend ändern.
Bei mir in Profan ist die Tilde (~) zur Maskierung des
Bindestrichs nötig. Bei VB u.a. ist es der Backslash \
soviel ich weiß. Also entsprechend korrigieren. Für die
weiteren Stringzugriffe müssen die Bindestriche entsprechend
entfernt oder ersetzt werden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.