如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但这不应该成为您回答的限制。
如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但这不应该成为您回答的限制。
当前回答
在Node中实现它的一个好方法是使用ajv包(https://github.com/epoberezkin/ajv)。
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefaults: 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
其他回答
除了Gambol的答案几乎在所有情况下都能做到这一点外,迄今为止给出的所有答案都忽略了分组格式(8-4-4-12)并不是对文本中的guid编码的强制要求。它被非常频繁地使用,但显然32个十六进制数字的简单链也可以有效。[1] regexenh:
/^[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$/i
这个问题是关于检查变量的,所以我们也应该包括用户不友好的表单。
为什么。net GUID中有破折号?-堆栈溢出+接受的答案 测试和验证一个GUID (guide .us) Guid。ToString方法(字符串)(MSDN)
如果使用uuid包,可以导入验证并将id传递给它
const { v4: uuidv4, validate } = require('uuid');
const { id } = request.params;
validate(id) ? true : false;
我认为Gambol的答案几乎是完美的,但它误解了RFC 4122§4.1.1。变型段有点。
它涵盖了变体-1 uuid (10xx = 8..b),但不包括为向后兼容性而保留的变体-0 (0xxx = 0..7)和变体-2 (110x = c..d)变体,因此它们在技术上是有效的uuid。变体4 (111x = e..f)确实是为将来使用而保留的,所以它们目前是无效的。
此外,0类型是无效的,“数字”只允许为0,如果它是NIL UUID(就像Evan的回答中提到的那样)。
所以我认为符合当前RFC 4122规范的最准确的正则表达式是(包括连字符):
/^([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)
在Node中实现它的一个好方法是使用ajv包(https://github.com/epoberezkin/ajv)。
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefaults: 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
正则表达式来拯救
/^[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');
或者用括号
/^\{?[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}\}?$/