2017-12-14 4 views
1

Ich benutze Simulink, um einige Zeichenfolgen zu verarbeiten, die von Remote-Server über TCP/IP in Echtzeit gesendet werden. Die Zeichenfolge (in Form von ASCII-Zahlen) Ich bin alle paar Millisekunden in Simulink immer ist diese (durch Komma getrennte Felder):N-te Feld aus String extrahieren mit Regex in Simulink M-Funktion

$FORMAT,YYYY-MM-DD HH:MM:SS.FFF,field1,field2,field3,field4,field5,field6*XX 

wo fields1-3 und field5 und FIELD6 sind Strings. XX ist eine XOR-Prüfsumme. Feld3 sagt mir, was ist der Name des Werts und Field4 hat einige Integer-Wert und diese beiden sind die Felder, die ich mit Regex extrahieren muss. Wie mache ich das?

PS: In Simulink (2016a) auf der Empfängerseite habe ich TCP/IP Receive-Block und die Zeichenfolge wird in Simulinks M-Funktion verarbeitet, so hat es einige Einschränkungen von regulären Matlab-Datei (zum Beispiel strsplit Methode nicht arbeite hier)

+1

Kann eines der Felder Kommas enthalten? – gnovice

+0

Nein Feld enthält Zahlen, einen Punkt für Gleitkomma und Zeichen von A bis Z, keine Kommas. – MCLenc

Antwort

1

Ich weiß nicht, welche Art von Regexes Simulinks "m-Funktion" unterstützt, aber wenn Sie capturing groups damit extrahieren können, können Sie jedes Feld leicht zuordnen. Hier ist ein regulärer Ausdruck für die mit erweiterten Leerzeichen und Kommentare für die Zwecke des Verstehens:

^   # start of the line 
[^,]* , # format 
[^,]* , # date 
[^,]* , # field1 
[^,]* , # field2 
([^,]*) , # field3 in capture group 1 
([^,]*) , # field4 in capture group 2 
      # we don’t need to match any more fields; we have the two we want 

Und hier in kompakter Form ist:

^[^,]*,[^,]*,[^,]*,[^,]*,([^,]*),([^,]*), 

Spiel Capture-Gruppen 1 und 2 (matches[1], $1, aber Sie tun das in Ihrer Umgebung), um den Inhalt von Feld3 und Feld4 zu erhalten.