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
Has thanked: 3 times

Regular expression - wycinanie fragmentu stringa

Post autor: PrzemB » 03 gru 2021 16:04

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
Has thanked: 3 times

Re: Regular expression - wycinanie fragmentu stringa

Post autor: PrzemB » 04 gru 2021 19:25

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 72 razy

Awatar użytkownika
Pitol
Moderator
Posty: 965
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków
Has thanked: 4 times
Been thanked: 9 times

Re: Regular expression - wycinanie fragmentu stringa

Post autor: Pitol » 06 gru 2021 15:31

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
Has thanked: 3 times

Re: Regular expression - wycinanie fragmentu stringa

Post autor: PrzemB » 08 gru 2021 10:32

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: 965
Rejestracja: 19 lip 2007 00:00
Wersja środowiska: LabVIEW 2019
Lokalizacja: Kraków
Has thanked: 4 times
Been thanked: 9 times

Re: Regular expression - wycinanie fragmentu stringa

Post autor: Pitol » 09 gru 2021 09:19

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