Saya mencari UUID dalam blok teks menggunakan regex. Saat ini saya mengandalkan asumsi bahwa semua UUID akan mengikuti pola 8-4-4-4-12 digit heksadesimal.
Adakah yang bisa memikirkan kasus penggunaan di mana asumsi ini tidak valid dan akan menyebabkan saya kehilangan beberapa UUID?
Jawaban:
Saya setuju bahwa menurut definisi regex Anda tidak ketinggalan UUID apa pun. Namun mungkin berguna untuk mencatat bahwa jika Anda mencari terutama untuk Pengidentifikasi Unik Global Microsoft (GUID), ada lima representasi string yang setara untuk GUID:
sumber
Regex untuk uuid adalah:
sumber
[a-f0-9]
! Karena hex! Regex Anda (sebagaimana adanya) dapat mengembalikan positif palsu.@ ivelin: UUID dapat memiliki modal. Jadi Anda harus toLowerCase () string atau menggunakan:
[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}
Akan hanya berkomentar ini tetapi tidak cukup rep :)
sumber
/.../i
Versi tidak.sumber: http://en.wikipedia.org/wiki/Uuid#Definition
Oleh karena itu, ini secara teknis lebih benar:
sumber
(:?8|9|A|B)
mungkin sedikit lebih mudah dibaca[89aAbB]
i
flag (case-insensitive).Jika Anda ingin memeriksa atau memvalidasi versi UUID tertentu , berikut adalah regex yang sesuai.
Nomor versi adalah karakter pertama dari grup ketiga
[VERSION_NUMBER][0-9A-F]{3}
::UUID v1:
UUID v2:
UUID v3:
UUID v4:
UUID v5:
sumber
a-f
sebelah setiapA-F
lingkup.i
akhir regex menandainya sebagai case-sensitive.format
pengubah dengan menyetelnya ke "uuid" daripada menggunakan regex untuk menguji UUID: swagger.io/docs/specification/data-models/data-types/#formatRegexp Gajus menolak UUID V1-3 dan 5, meskipun mereka valid.
sumber
[\w]{8}(-[\w]{4}){3}-[\w]{12}
telah bekerja untuk saya dalam banyak kasus.Atau jika Anda ingin benar-benar spesifik
[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}
.sumber
\w
biasanya berarti "karakter kata" Ini akan cocok dengan lebih dari hex-digit. Solusi Anda jauh lebih baik. Atau, untuk kompatibilitas / keterbacaan yang dapat Anda gunakan[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')
Dalam python re, Anda dapat membentang dari alpha numerik ke huruf besar. Begitu..
Itu membuat regex UUID Python paling sederhana:
Saya akan meninggalkannya sebagai latihan bagi pembaca untuk menggunakan timeit untuk membandingkan kinerja ini.
Nikmati. Simpan Pythonic ™!
CATATAN: Rentang itu juga akan cocok
:;<=>?@'
, jika Anda curiga bisa memberikan Anda hasil positif palsu, jangan ambil jalan pintas. (Terima kasih Oliver Aubert untuk menunjukkannya di komentar.)sumber
Menurut definisi, UUID adalah 32 digit heksadesimal, dipisahkan dalam 5 grup oleh tanda hubung, seperti yang telah Anda jelaskan. Anda tidak boleh ketinggalan dengan ekspresi reguler Anda.
http://en.wikipedia.org/wiki/Uuid#Definition
sumber
Jadi, saya pikir Richard Bronosky sebenarnya memiliki jawaban terbaik saat ini, tetapi saya pikir Anda dapat melakukan sedikit untuk membuatnya agak lebih sederhana (atau setidaknya terser):
sumber
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){4}[0-9a-f]{8}', re.I)
Varian untuk C ++:
sumber
Untuk UUID yang dihasilkan pada OS X dengan
uuidgen
, pola regex adalahVerifikasi dengan
sumber
BTW, hanya memperbolehkan 4 pada salah satu posisi hanya berlaku untuk UUIDv4. Tetapi v4 bukan satu-satunya versi UUID yang ada. Saya telah bertemu v1 dalam latihan saya juga.
sumber
Jika menggunakan Posix regex (
grep -E
, MySQL, dll.), Ini mungkin lebih mudah dibaca & diingat:sumber
Untuk bash:
Sebagai contoh:
sumber