Değişkenin geçerli UUID / GUID tanımlayıcısı içerip içermediğini nasıl kontrol edebilirim?
Şu anda yalnızca 1 ve 4 tiplerini doğrulamakla ilgileniyorum, ancak cevaplarınız için bir sınırlama olmamalıdır.
Değişkenin geçerli UUID / GUID tanımlayıcısı içerip içermediğini nasıl kontrol edebilirim?
Şu anda yalnızca 1 ve 4 tiplerini doğrulamakla ilgileniyorum, ancak cevaplarınız için bir sınırlama olmamalıdır.
Yanıtlar:
Şu anda, UUID'ler RFC4122'de belirtildiği gibidir. Sıklıkla ihmal edilen bir uç durum, burada belirtilen NIL UUID'dir . Aşağıdaki normal ifade bunu dikkate alır ve bir NIL UUID için bir eşleşme döndürür. Yalnızca NIL olmayan UUID'leri kabul eden bir UUID için aşağıya bakın. Bu çözümlerin her ikisi de 1 ila 5 sürümleri içindir (üçüncü bloğun ilk karakterine bakın).
Bu nedenle bir UUID'yi doğrulamak için ...
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i
... Sürüm 1 ila 5 olan ve RFC4122'ye göre uygun Varyant olan standart olarak biçimlendirilmiş bir UUID'ye sahip olmanızı sağlar.
NOT: Diş telleri {
ve }
kanonik değildir. Bazı sistemlerin ve kullanımların bir eseridir.
Orijinal sorunun gereksinimlerini karşılamak için yukarıdaki regex değiştirmek kolaydır.
İPUCU: normal ifade grubu / yakalar
NIL UUID ile eşleşmeyi önlemek için:
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
kurtarmaya düzenli
/^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test('01234567-9ABC-DEF0-1234-56789ABCDEF0');
veya braketlerle
/^\{?[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}\}?$/
/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
Belirli bir UUID sürümünü kontrol etmek veya doğrulamak istiyorsanız, ilgili regex'ler aşağıdadır.
Tek farkın, UUID 4122 RFC
4.1.3. Version
bölümünde açıklanan sürüm numarası olduğuna dikkat edin .
Sürüm numarası üçüncü grubun ilk karakteridir [VERSION_NUMBER][0-9A-F]{3}
:
UUID v1:
/^[0-9A-F]{8}-[0-9A-F]{4}-[1][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
UUID v2:
/^[0-9A-F]{8}-[0-9A-F]{4}-[2][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
UUID v3:
/^[0-9A-F]{8}-[0-9A-F]{4}-[3][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
UUID v4:
/^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
UUID v5:
/^[0-9A-F]{8}-[0-9A-F]{4}-[5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
Geliştirme için Node.js kullanıyorsanız, Validator adlı bir paket kullanılması önerilir. UUID'lerin farklı sürümlerini doğrulamak için gereken tüm regex'leri içerir ve ayrıca doğrulama için çeşitli işlevler alırsınız.
İşte npm bağlantısı: Validator
var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false
/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i
ve / veya /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
ve / veya /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
ve / veya /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
Gambol'un hemen hemen her durumda işi yapacak cevabının yanı sıra , şimdiye kadar verilen tüm cevaplar, gruplandırılmış biçimlendirmenin (8-4-4-4-12) metindeki GUID'leri kodlamak için zorunlu olmadığını kaçırdı . Son derece sık kullanılır, ancak açıkçası 32 onaltılık basamaklı düz bir zincir de geçerli olabilir. [1] normal ifade enh :
/^[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$/i
[1] bir soru ile ilgili olan kontrol ing değişken biz de kullanıcı dostu olmayan bir form dahil bu yüzden, s.
{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?
Şimdiye kadar yayınlanan tüm türe özgü regex'ler, RFC'nin 4.1.7'sinde tanımlanan "type 0" Nil UUID'de başarısız oluyor:
Nil UUID, 128 bitin hepsinin sıfıra ayarlandığı belirtilen özel UUID biçimidir:
00000000-0000-0000-0000-000000000000
Wolf'un cevabını değiştirmek için:
/^[0-9a-f]{8}-?[0-9a-f]{4}-?[0-5][0-9a-f]{3}-?[089ab][0-9a-f]{3}-?[0-9a-f]{12}$/i
Veya, sıfır olmayan bir "tip 0" ı düzgün bir şekilde hariç tutmak için aşağıdakilere sahibiz (Luke sayesinde):
/^(?:[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
abcdef00-0000-0000-0000-000000000000
normal ifadenizle eşleşir. Bu normal ifade, nil dahil olmak üzere geçerli UUID'lerle eşleşecek:/^(?:[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
Bence Gambol'un cevabı neredeyse mükemmel, ama RFC 4122 § 4.1.1'i yanlış yorumluyor . Varyant bölümü biraz.
Varyant-1 UUID'leri (10xx = 8..b) kapsar, ancak geriye dönük uyumluluk için ayrılmış Varyant-0 (0xxx = 0..7) ve Varyant-2 (110x = c..d) varyantlarını kapsamaz, dolayısıyla teknik olarak geçerli UUID'lerdir. Varyant-4 (111x = e..f) gerçekten ileride kullanılmak üzere ayrılmıştır, bu nedenle şu anda geçerli değildir.
Ayrıca, 0 türü geçerli değil, "basamak" ın yalnızca bir NIL UUID olması durumunda ( Evan'ın cevabında belirtildiği gibi) 0 olmasına izin verilir .
Bu yüzden mevcut RFC 4122 belirtimine uyan en doğru regex olduğunu düşünüyorum (tireler dahil):
/^([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[0-9a-d][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i
^ ^^^^^^
(0 type is not valid) (only e..f variant digit is invalid currently)
Dize'nin UUID olup olmadığını kontrol etmek için .match () yöntemini kullanın.
public boolean isUUID(String s){
return s.match("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$");
}
Yukarıdaki cevapların biraz değiştirilmiş bir versiyonu daha özlü bir şekilde yazılmıştır. Bu, herhangi bir GUID'yi kısa çizgilerle doğrular (ancak kısa çizgileri isteğe bağlı yapmak için kolayca değiştirilebilir). Bu, şartnameden bağımsız olarak kural haline gelen büyük ve küçük harfleri de destekleyecektir:
/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
Buradaki anahtar aşağıdaki yinelenen kısım
(([0-9a-fA-F]{4}\-){3})
Hangi 4 karakter desenini 3 kez tekrarlar
A-f
şöyle olmalı A-F
:/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
Düğümde yapmanın iyi bir yolu ajv
paketi kullanmaktır ( https://github.com/epoberezkin/ajv ).
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefault: true, verbose: true });
const uuidSchema = { type: 'string', format: 'uuid' };
ajv.validate(uuidSchema, 'bogus'); // returns false
ajv.validate(uuidSchema, 'd42a8273-a4fe-4eb2-b4ee-c1fc57eb9865'); // returns true with v4 GUID
ajv.validate(uuidSchema, '892717ce-3bd8-11ea-b77f-2e728ce88125'); // returns true with a v1 GUID
Daha iyi bir yol bu düzenli ifadeleri önlemek için fromString statik yöntemini kullanmak olduğunu düşünüyorum.
id = UUID.randomUUID();
UUID uuid = UUID.fromString(id.toString());
Assert.assertEquals(id.toString(), uuid.toString());
Diğer yandan
UUID uuidFalse = UUID.fromString("x");
throws java.lang.IllegalArgumentException: Geçersiz UUID dizesi: x