Bagaimana cara memeriksa apakah variabel berisi pengidentifikasi UUID / GUID yang valid?
Saat ini saya hanya tertarik untuk memvalidasi tipe 1 dan 4, tetapi seharusnya tidak menjadi batasan untuk jawaban Anda.
javascript
regex
validation
uuid
guid
Marek Sebera
sumber
sumber
Jawaban:
Saat ini, UUID adalah sebagaimana ditentukan dalam RFC4122. Kasus tepi yang sering diabaikan adalah UUID NIL, yang disebutkan di sini . Regex berikut mempertimbangkan ini dan akan mengembalikan kecocokan untuk UUID NIL. Lihat di bawah ini untuk UUID yang hanya menerima UUID non-NIL. Kedua solusi ini adalah untuk versi 1 hingga 5 (lihat karakter pertama dari blok ketiga).
Karena itu untuk memvalidasi UUID ...
... memastikan Anda memiliki UUID yang diformat kanonik yaitu Versi 1 hingga 5 dan merupakan Varian yang sesuai sesuai RFC4122.
CATATAN: Kawat gigi
{
dan}
bukan kanonik. Mereka adalah artefak dari beberapa sistem dan penggunaan.Mudah untuk memodifikasi regex di atas untuk memenuhi persyaratan pertanyaan aslinya.
PETUNJUK: regex grup / tangkapan
Untuk menghindari pencocokan NIL UUID:
sumber
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
regex untuk menyelamatkan
atau dengan kurung
sumber
/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
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
Jika Anda menggunakan Node.js untuk pengembangan, disarankan untuk menggunakan paket yang disebut Validator. Ini mencakup semua regex yang diperlukan untuk memvalidasi versi berbeda dari UUID plus Anda mendapatkan berbagai fungsi lainnya untuk validasi.
Inilah tautan npm: Validator
sumber
/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i
dan / atau/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
dan / atau/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
dan / atau/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
Selain jawaban Gambol yang akan melakukan pekerjaan dalam hampir semua kasus , semua jawaban yang diberikan sejauh ini terlewatkan sehingga pemformatan yang dikelompokkan (8-4-4-4-12) tidak wajib untuk menyandikan GUID dalam teks . Ini digunakan sangat sering tetapi jelas juga rantai polos 32 digit heksadesimal dapat valid. [1] peningkatan regex :
[1] Pertanyaannya adalah tentang cek ing variabel s, jadi kami harus mencakup bentuk tidak ramah-pengguna juga.
sumber
{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?
Semua regex spesifik tipe yang diposting sejauh ini gagal pada UUID "tipe 0", didefinisikan dalam 4.1.7 dari RFC sebagai:
Untuk memodifikasi jawaban Wolf:
Atau, untuk mengecualikan "tipe 0" dengan benar tanpa semua nol, kami memiliki yang berikut (terima kasih kepada Luke):
sumber
abcdef00-0000-0000-0000-000000000000
akan cocok dengan regex Anda. Regex ini akan cocok dengan UUID yang valid, termasuk nol:/^(?:[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
terima kasih kepada @usertatha dengan beberapa modifikasi
sumber
Saya pikir jawaban Gambol hampir sempurna, tetapi salah mengartikan RFC 4122 § 4.1.1. Bagian varian sedikit.
Ini mencakup Varian-1 UUIDs (10xx = 8..b), tetapi tidak mencakup Varian-0 (0xxx = 0..7) dan varian Varian-2 (110x = c..d) yang dicadangkan untuk kompatibilitas ke belakang, jadi itu adalah UUID yang secara teknis valid. Varian-4 (111x = e..f) memang disediakan untuk penggunaan di masa mendatang, sehingga saat ini tidak valid.
Juga, 0 type tidak valid, "digit" itu hanya boleh 0 jika itu NIL UUID (seperti disebutkan dalam jawaban Evan ).
Jadi saya pikir regex paling akurat yang sesuai dengan spesifikasi RFC 4122 saat ini adalah (termasuk tanda hubung):
sumber
Gunakan metode .match () untuk memeriksa apakah String adalah UUID.
sumber
Versi yang sedikit dimodifikasi dari jawaban di atas ditulis dengan cara yang lebih ringkas. Ini akan memvalidasi GUID apa pun dengan tanda hubung (namun mudah dimodifikasi untuk menjadikan tanda hubung opsional). Ini juga akan mendukung karakter huruf besar dan kecil yang telah menjadi konvensi terlepas dari spesifikasinya:
Kuncinya di sini adalah bagian berulang di bawah ini
Yang hanya mengulangi pola 4 char 3 kali
sumber
A-f
harusA-F
seperti itu:/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
Cara yang baik untuk melakukannya di Node adalah dengan menggunakan
ajv
paket ( https://github.com/epoberezkin/ajv ).sumber
Saya pikir cara yang lebih baik adalah menggunakan metode statis dari Strtring untuk menghindari ekspresi reguler itu.
Di samping itu
throws java.lang.IllegalArgumentException: String UUID tidak valid: x
sumber