Jak sprawdzić, czy zmienna zawiera prawidłowy identyfikator UUID / GUID?
Obecnie jestem zainteresowany tylko sprawdzaniem poprawności typów 1 i 4, ale nie powinno to stanowić ograniczenia dla twoich odpowiedzi.
javascript
regex
validation
uuid
guid
Marek Sebera
źródło
źródło
Odpowiedzi:
Obecnie identyfikatory UUID są określone w RFC4122. Często pomijanym przypadkiem na krawędzi jest NIL UUID, odnotowany tutaj . Poniższy wyrażenie regularne bierze to pod uwagę i zwróci dopasowanie dla UUID NIL. Zobacz poniżej UUID, który akceptuje tylko UUID inne niż NIL. Oba rozwiązania dotyczą wersji od 1 do 5 (patrz pierwszy znak trzeciego bloku).
Dlatego, aby sprawdzić poprawność UUID ...
... zapewnia, że masz kanonicznie sformatowany identyfikator UUID, który jest w wersji od 1 do 5 i jest odpowiednią wersją zgodnie z RFC4122.
UWAGA: Szelki
{
i}
nie są kanoniczne. Są artefaktem niektórych systemów i zastosowań.Łatwo zmodyfikować powyższe wyrażenie regularne, aby spełnić wymagania pierwotnego pytania.
WSKAZÓWKA: regex group / capture
Aby uniknąć dopasowania NIL UUID:
źródło
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
regex na ratunek
lub w nawiasach
źródło
/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
Jeśli chcesz sprawdzić lub sprawdzić konkretną wersję UUID, oto odpowiednie wyrażenia regularne.
Numer wersji to pierwszy znak trzeciej grupy
[VERSION_NUMBER][0-9A-F]{3}
:UUID v1:
UUID v2:
UUID v3:
UUID v4:
UUID v5:
źródło
Jeśli używasz Node.js do programowania, zaleca się użycie pakietu o nazwie Validator. Zawiera wszystkie wyrażenia regularne wymagane do sprawdzania poprawności różnych wersji UUID oraz różne inne funkcje do sprawdzania poprawności.
Oto link npm: Validator
źródło
/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i
i / lub/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
i / lub/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
i / lub/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
Oprócz odpowiedzi Gambol, która wykona zadanie w prawie wszystkich przypadkach , wszystkie dotychczas udzielone odpowiedzi pominęły, że zgrupowane formatowanie (8-4-4-4-12) nie jest obowiązkowe do kodowania GUID w tekście . Jest używany bardzo często, ale oczywiście poprawny może być również zwykły łańcuch 32 cyfr szesnastkowych. [1] regex enh :
[1] Chodzi o to o sprawdzenie ing zmienna s, więc należy zaliczyć kształt nieprzyjazny dla użytkownika, jak również.
źródło
{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?
Wszystkie opublikowane wcześniej wyrażenia specyficzne dla typu kończą się niepowodzeniem na UUID „zero 0”, zdefiniowanym w 4.1.7 RFC, jako:
Aby zmodyfikować odpowiedź Wolfa:
Lub, aby poprawnie wykluczyć „typ 0” bez wszystkich zer, mamy następujące (dzięki Łukaszowi):
źródło
abcdef00-0000-0000-0000-000000000000
pasuje do wyrażenia regularnego. Ta regex będzie pasować do prawidłowych UUID, w tym zero:/^(?:[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i
dzięki @usertatha z pewnymi modyfikacjami
źródło
Myślę, że odpowiedź Gambola jest prawie idealna, ale źle interpretuje RFC 4122 § 4.1.1. Część wariantu trochę.
Obejmuje UUID wariantu 1 (10xx = 8..b), ale nie obejmuje wariantów wariantu 0 (0xxx = 0..7) i wariantu 2 (110x = c..d), które są zarezerwowane dla kompatybilności wstecznej, więc są technicznie poprawnymi identyfikatorami UUID. Wariant 4 (111x = e..f) jest rzeczywiście zarezerwowany do wykorzystania w przyszłości, więc obecnie nie są one ważne.
Ponadto typ 0 jest niepoprawny, ta „cyfra” może być równa 0, jeśli jest to NU UUID (jak wspomniano w odpowiedzi Evana ).
Myślę więc, że najdokładniejszym wyrażeniem regularnym zgodnym z aktualną specyfikacją RFC 4122 jest (w tym łączniki):
źródło
Użyj metody .match (), aby sprawdzić, czy String jest UUID.
źródło
Nieco zmodyfikowana wersja powyższych odpowiedzi napisana w bardziej zwięzły sposób. Spowoduje to sprawdzenie poprawności dowolnego identyfikatora GUID z łącznikami (bez względu na łatwość modyfikacji, tak aby łączniki były opcjonalne). Będzie to również obsługiwać wielkie i małe litery, które stały się konwencją niezależnie od specyfikacji:
Kluczem tutaj jest powtarzająca się część poniżej
Który po prostu powtarza 4 wzorce znaków 3 razy
źródło
A-f
powinno byćA-F
tak:/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
Dobrym sposobem na zrobienie tego w węźle jest użycie
ajv
pakietu ( https://github.com/epoberezkin/ajv ).źródło
Myślę, że lepszym sposobem jest użycie metody statycznej fromString, aby uniknąć tych wyrażeń regularnych.
Z drugiej strony
wyrzuca java.lang.IllegalArgumentException: Niepoprawny ciąg UUID: x
źródło