niedziela, 24 sierpnia 2014

Regex Tester - wyrażenia regularne C#

Witajcie!

Chyba jak każdy programista czy to procesorów czy aplikacji na PC przyszło mi się
zmierzyć z prawidłowym wyłuskaniem danych z dokumentu tekstowego (excel, txt itp), ale
także z parsowaniem nadlatujących danych z procka.

I tutaj jeśli chodzi o procesory to sprawa jest trudniejsza ponieważ nie wiemy dokładnie
jakie dane nam nadlecą, czy wystąpią błędy w transmisji, czy ramka będzie cała, a w
komunikacji bezprzewodowej to już całkiem może być różnie.

Ja miałem problemy z komunikacją po RS485 w swoim robocie gdzie ogrom danych
był wysyłany z czujników jak również były wysyłane komendy sterujące pracą robota
(robot przemysłowy) i tutaj często zamiast poprawnych danych dostawałem
dziwne litery w ciągu cyfr.
Wiadomo można zaimplementować sprawdzenie danych CRC itp, ale można też w inny
sposób i ten sposób chciałbym omówić.

Wyjściem z tej trudnej sytuacji może być zaimplementowanie w naszym programie klasy Regex.
Regex przeszukuje łańcuchy znakowe w oparciu o określona strukturę czyli maskę.
Jednym słowem jeśli na wejście podamy łańcuch tekstowy to regex w oparciu o maskę
przefiltruje tekst i wypluje na wyjście tylko to co potrzebujemy.

Na nasze potrzeby napisałem program który pokaże to o czym napisałem powyżej.


Program jest bardzo porosty i intuicyjny. W pierwszym polu tekstowym wpisujemy
ciąg tekstowy do sprawdzenia czy wyłuskania danych. W drugim polu tekstowym 
piszemy naszą maskę względem której program przefiltruje tekst, a w ostatnim polu 
dostajemy nasz wynik końcowy. 

Ok to teraz przykład:
Powiedzmy, że zrobiliśmy komunikacje z naszym urządzeniem i z procesora dostajemy
dane takiej treści - 4598;1267;100 
Są to np: dane z czujników i enkodera (tak dla przykładu tylko) i teraz powiedzmy, że
komunikacja coś szwankuje i dostajemy w naszym ciągu coś takiego 45q8;1267;100.
Jeśli robimy jakiś wykres w naszym programie to dostaniemy bzdury lub program się 
nam wysypie podczas parsowania, że otrzymany ciąg nie jest liczbą i co teraz?
Teraz to się tylko załamać i wywalić kompa przez okno - heh żarcik!

Teraz to skorzystamy z naszego testera masek i zrobimy taką maskę, że wszelkie 
inne dane których nie chcemy to nie dostaniemy:) - proste!


W pierwszym polu wpisaliśmy nasze dane, w drugim zaś naszą maskę po której ma fitrować
dane przychodzące z procesora. W trzecim polu tekstowym otrzymaliśmy komunikat o 
pasujących dopasowaniach (czyli maska jest poprawna) i co najlepsze to jeszcze pogrupowane
dane czyli cóż więcej chcieć:).

Ale ktoś zapyta co to za ślaczki wpisał gościu i gada, że to działa - heh już tłumaczę.
- ^ - daszek oznacza że zaczynamy przeszukiwać wyrażenie od początku wiersza
- \d - dopasowujemy dowolną cyfrę dziesiętną {1,} a tutaj ile ma być występień tych cyfr
         czyli więcej niż jedna, można napisać np: {4} i tylko dopasuje nam 4 cyfry ni mniej 
         ni więcej
-; - czyli w ciągu musi po cyfrach wystąpić znak średnika

Dalej maska się powtarza. Więc proste:)

Jak wspomniałem wcześniej możemy takimi maskami odfiltrować całe skoroszyty excela z danych
bardzo szybko i wyłuskać tylko takie jakie nas interesują.
Zastanówcie się ile trzeba było by pisać kodu jeśli trzeba było by robić if-y splity itp.

Link do programu.

Zachęcam do testowania i implementacji regexa w swoich aplikacjach