Szukam UUID w blokach tekstu za pomocą wyrażenia regularnego. Obecnie opieram się na założeniu, że wszystkie UUID będą miały wzór 8-4-4-4-12 cyfr szesnastkowych.
Czy ktoś może pomyśleć o przypadku użycia, w którym to założenie byłoby nieważne i spowodowałoby, że przegapiłem niektóre UUID?
Odpowiedzi:
Zgadzam się, że z definicji wyrażenie regularne nie zawiera żadnego identyfikatora UUID. Warto jednak zauważyć, że jeśli szukasz szczególnie unikatowych identyfikatorów globalnych (GUID) firmy Microsoft, istnieje pięć równoważnych ciągów znaków dla identyfikatora GUID:
źródło
Wyrażenie regularne dla uuid to:
źródło
[a-f0-9]
! Jak to hex! Twoje wyrażenie regularne (tak jak jest) może zwracać fałszywe alarmy.@ivelin: UUID może mieć wielkie litery. Musisz albo toLowerCase () napis lub użyć:
[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}
Po prostu skomentowałbym to, ale za mało rep :)
źródło
/.../i
Wersja nie.źródło: http://en.wikipedia.org/wiki/Uuid#Definition
Dlatego jest to technicznie bardziej poprawne:
źródło
(:?8|9|A|B)
Prawdopodobnie jest też nieco bardziej czytelny, ponieważ[89aAbB]
i
flagi (bez rozróżniania wielkości liter).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
a-f
obok każdegoA-F
zakresu.i
Na końcu znaków regex go jako wielkość liter ma znaczenie.format
modyfikatora ustawiając go na „uuid” zamiast używać wyrażenia regularnego do testowania UUID: swagger.io/docs/specification/data-models/data-types/#formatWyrażenie regularne Gajusa odrzuca UUID V1-3 i 5, nawet jeśli są poprawne.
źródło
[\w]{8}(-[\w]{4}){3}-[\w]{12}
pracował dla mnie w większości przypadków.Lub jeśli chcesz być naprawdę konkretny
[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.źródło
\w
zwykle oznacza „znaki słowne”. Będzie pasować znacznie więcej niż cyfr szesnastkowych. Twoje rozwiązanie jest znacznie lepsze. Lub, dla kompatybilności / czytelności, której możesz użyć[a-f0-9]
import re def valid_uuid(uuid): regex = re.compile('[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}', re.I) match = regex.match(uuid) return bool(match) valid_uuid('2wtu37k5-q174-4418-2cu2-276e4j82sv19')
W Python Re można rozciągać od alfabetu na duże litery. Więc..
To sprawia, że najprostsze wyrażenie regularne UUID w Pythonie:
Zostawię to jako ćwiczenie dla czytelnika, aby użyć timeit do porównania ich wydajności.
Cieszyć się. Keep it Pythonic ™!
UWAGA: Te zakresy również będą pasować,
:;<=>?@'
więc jeśli podejrzewasz, że może to dać fałszywe alarmy, nie bierz skrótu. (Dziękuję Oliverowi Aubertowi za wskazanie tego w komentarzach.)źródło
Z definicji UUID składa się z 32 cyfr szesnastkowych, oddzielonych w 5 grupach łącznikami, tak jak opisano. Nie powinieneś przegapić żadnego z wyrażeniem regularnym.
http://en.wikipedia.org/wiki/Uuid#Definition
źródło
Tak więc, myślę, że Richard Bronosky rzeczywiście ma najlepszą jak do tej pory odpowiedź, ale myślę, że możesz zrobić trochę, aby uczynić to nieco prostszym (lub przynajmniej krótszym):
źródło
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
Wariant dla C ++:
źródło
W przypadku identyfikatora UUID wygenerowanego w systemie OS X za
uuidgen
pomocą wzorca wyrażenia regularnego jestZweryfikuj za pomocą
źródło
BTW, dopuszczenie tylko 4 na jednej pozycji jest ważne tylko dla UUIDv4. Ale v4 nie jest jedyną istniejącą wersją UUID. W mojej praktyce spotkałem również v1.
źródło
Jeśli używasz wyrażenia regularnego Posix (
grep -E
, MySQL itp.), Może to być łatwiejsze do odczytania i zapamiętania:źródło
Do bash:
Na przykład:
źródło