Regular expression - wycinanie fragmentu stringa

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Regular expression - wycinanie fragmentu stringa

Post autor: PrzemB »

Krótkie pytanie o skonstruowanie wyrażenia "Regular expression". Próbuję z depeszy czujnika wyciągnąć interesujące mnie informacje. Depesza wygląda tak:
$VNINS,000498.176257,0000,0080,+025.423,-000.152,-000.055,+00.00000000,+000.00000000,+00000.000,+000.000,+000.000,+000.000,99.99,00.01,0.001*5C\r\n
Chciałbym wykorzystać blok "Match regular expression" i wyciąć wszystko pomiędzy znacznikiem początku "$VNINS," a znakami końca linii "\r\n". Czy ktoś może pomóc? Przeglądałem różne struktury wyrażeń regularnych, ale nie znalazłem odpowiedzi na mój problem.
Pozdrawiam
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Re: Regular expression - wycinanie fragmentu stringa

Post autor: PrzemB »

Cześć,
jakoś nie ma żadnych podpowiedzi. Zrobiłem wycinanie ramki danych inna metodą. Wrzucam - może komuś się przyda, a może ktoś pokaże mi jak to zrobić lepiej (zwłaszcza zależy mi na szybkości działania - ma to być wykorzystane w aplikacji RT) - zawsze warto się uczyć :D
vn_parse.PNG
vn_parse_02.PNG
vn_parse_01.PNG
Załączniki
vectornav_parse_v02.vi
(19.2 KiB) Pobrany 136 razy
Awatar użytkownika
Pitol
Moderator
Posty: 984
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Regular expression - wycinanie fragmentu stringa

Post autor: Pitol »

Hej,

Fajnie, że się sam za to wziąłeś :)
Może nie wyszło najlepiej ale ważne, że działa!

Do zabawy z wyrażeniami regularnymi polecam jakiś edytor/parser online, np. https://regex101.com.
Ja z niego korzystam często i gęsto. W LabVIEW testowanie czegoś jest utrudnione, lepiej to zrobić online.
Potem tylko wklejasz wyrażenie do LV i gotowe.

W Twoim przypadku można zrobić to zadanie łatwiej.
Zdecydowanie łatwiej :)

Zakładam, że nazwa ramki to "VNINS" a CRC to "5C".
Wyrażenie regularne składa się z kilku elementów:
  • \$ - znacznik startu wiadomości
  • (\w+) - pierwsza grupa - zgarnij wszystkie litery - nazwa ramki
  • (.*) - druga grupa - zgarnij wszystko (liczby, litery, przecinki, itp.) - zakładam, że nie będzie tu tekstu aż to CRC
  • \* - znacznik CRC
  • (\w+) - trzecia grupa - zgarnij wszystkie litery - CRC
RegExp.png
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
PrzemB
Posty: 38
Rejestracja: 24 mar 2015 18:42
Wersja środowiska: LabVIEW 2017

Re: Regular expression - wycinanie fragmentu stringa

Post autor: PrzemB »

Właśnie czegoś takiego szukałem - wielkie dzięki. Jedno tylko dodatkowe pytanie - jak w regular expression wyszukać znak końca linii? Chodzi mi o to, że po jednej pełnej depeszy często trafia się początek kolejnej, który trzeba odesłać do połączenia z kolejnym stringiem (stąd u mnie te dodatkowe case'y). Zatem lepiej byłoby wyszukiwać wszystko o $ do \n
Pozdrawiam
Przemek
Awatar użytkownika
Pitol
Moderator
Posty: 984
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków

Re: Regular expression - wycinanie fragmentu stringa

Post autor: Pitol »

Ta ostatnia grupa (\w+) łapie tylko litery.
Jeśli zaraz po CRC przyjdzie \r\n i coś jeszcze, to nie będzie to w żaden sposób przetworzone.
Aby to wyłapać, skorzystaj z wyjścia "After Match", które zwróci wszystko, co zostało ze stringa wejściowego.
Potem możesz to dokleić do kolejnej porcji danych i takiego stringa znów wrzucić na RegExp.
ObrazekObrazekObrazek
Chcesz taki podpis? Zajrzyj tutaj
ODPOWIEDZ