(VB.net) RegEx nur matchen wenn N Zeichen

Gast #7294993
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
Gast #7295001
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.
Gast #7295006
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
Gast #7295032
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.
Gast #7295074
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.
Gast #7295282
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.