Wpis z mikrobloga

#wyrazeniaregularne #regexp #programowanie

Potrzebuję kilkunastu dobrze sprawdzonych wyrażeń regularnych (np. do walidacji formularzy tzn. np. z datą, godziną, emailem, numerem telefonu itd. itd).

Mógłbym sam je napisać, ale nie będą idealne. Mógłbym poszukać forach/stackoverflow, ale też nie jest pewne, że nie zawierają jakiś błędów.

Najchętniej wziąłbym z jakiegoś gotowca napisanego przez profesjonalistów. Wiem, że np. w C# (ASP.NET) są zaszyte gotowe do sprawdzania, podobnie jest chyba w AngularJS. Nie wiem tylko jak stamtąd wyciągnąć same wyrażenia. Są gdzieś jeszcze? Może coś w Javie? Lub w jakiejś "dokumentacji"?
  • 9
@MacDada: Wiem, że do pisania aplikacji najlepsze są gotowe biblioteki. Mi jednak potrzebne są gotowe wyrażenia (załóżmy, że w celach edukacyjnych).

Tu coś znalazłem:
https://en.wikipedia.org/wiki/Bean_Validation
http://beanvalidation.org/
http://hibernate.org/validator/

Ale nadal nie umiem wyciągnąć stamtąd gotowych wyrażeń.

Tu mam kod źródłowy: https://github.com/hibernate/hibernate-validator
No i np. dla emaila coś jest: https://github.com/hibernate/hibernate-validator/blob/6ae19900e2951513034534f9aec786689da9b4d8/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/returnvaluevalidation/ContactBean.java

Ale dla innych (choćby "post code") nie mogę znaleźć ( ͡° ʖ̯ ͡°)

No i mam wątpliwości czy na
(załóżmy, że w celach edukacyjnych)


@mk321: Czyli, że w jakich? Nie ma czegoś takiego jak „pro najlepsze wyrażenia”, bo nie wszystko dobrze waliduje się regexpami + są różne oczekiwania wobec walidacji.

Np email można walidować na gazylion różnych sposobów (od prostego sprawdzenia czy jest małpka, po sprawdzanie czy domena z mejla odpowiada).

Popatrz np na tę dyskusję: jedni powiedzą, że walidacja emaila za pomocą tej biblioteki jest zbyt luźna, a jeśli
Czyli, że w jakich?


@MacDada: Chcę mieć w aplikacji w Javie i JavaScript walidację taką jak w Springu (adnotacje), ale nie chcę używać ich biblioteki (ani żadnych dodatkowych - sam czysty kod).

Oczekiwanie wobec walidacji mam takie, żeby było jak w gotowych profesjonalnych bibliotekach (choćby ta ze Springa/Hibernate).

Odnośnie samego emaila, to według mnie poprawne są te implementujące oficjalny standard (RFC 5322). Ale jeśli rzeczywiście w bibliotekach go nie
@mk321: Nie ogarniesz tego dobrze „sam” i zresztą nie ma sensu. Użyj bibliotek. Do tego są, żeby nie wynajdować koła na nowo.

Choćby dlatego, że jak jakaś reguła będzie miała błąd, to biblioteka zostanie zaktualizowana i Twój kod też. Czy może masz zamiar potem ręcznie śledzić wszystkich wokół i dostosowywać swój kopiuj–wklejkowany kod?

Java i Javascript to dwie zupełnie odmienne technologie (mimo, iż nazwa sugeruje podobieństwo). Pamiętaj o celach walidacji:

1.
Choćby dlatego, że jak jakaś reguła będzie miała błąd, to biblioteka zostanie zaktualizowana i Twój kod też. Czy może masz zamiar potem ręcznie śledzić wszystkich wokół i dostosowywać swój kopiuj–wklejkowany kod?


@MacDada: chcę po prostu zobaczyć jaki jest stan na teraz. Nawet jeśli nie są idealne, nawet jak będą aktualizowane.

Java i Javascript to dwie zupełnie odmienne technologie (mimo, iż nazwa sugeruje podobieństwo).


@MacDada: to wiem, 10 latu temu gimbazie
No i np. dla emaila coś jest: https://github.com/hibernate/hibernate-validator/blob/6ae19900e2951513034534f9aec786689da9b4d8/engine/src/test/java/org/hibernate/validator/test/internal/engine/methodvalidation/returnvaluevalidation/ContactBean.java


@mk321: To jest faktycznie „tylko” test czy walidacja działa poprawnie.

Tu masz „constrainty”, czyli „definicje” co należy zwalidować, np możesz jakieś pole obiektu oznaczyć „constraintem” URL, dzięki czemu system walidacji wie, że ma sprawdzić, że pole jest URLem:
https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/constraints

Tu masz „walidatory” – czyli klasy, które sprawdzają wartości odpowiadające zdefiniowanym constraintom:
https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators

Np tutaj masz ową walidację URLa:
https://github.com/hibernate/hibernate-validator/blob/6ae19900e2951513034534f9aec786689da9b4d8/engine/src/main/java/org/hibernate/validator/internal/constraintvalidators/hv/URLValidator.java

----

Podobną strukturę
@MacDada: o to mi chodziło :) Dzięki :)


Właśnie nie mogłem znaleźć tych klas "walidatorów".

Teraz widzę, że od środka wygląda to trochę inaczej niż myślałem, i raczej mniej niż więcej jest oparte na wyrażeniach regularnych (no i jednak nie mogę ich tak łatwo skopiować).

No i w emailu odwołują się do RFC, ale nie implementują całości, bo nie potrzeba - to chciałem wiedzieć.