如何检查变量是否包含有效的UUID/GUID标识符?

我目前只对验证类型1和4感兴趣,但这不应该成为您回答的限制。


当前回答

如果您使用uuid包,这个包会带来一个布尔验证函数,它会告诉您uuid是否有效。

例子:

import { validate as isValidUUID } from 'uuid';

if (!isValidUUID(tx.originId)) {
  return Promise.reject('Invalid OriginID');
}

其他回答

目前,UUID是在RFC4122中指定的。一个经常被忽视的边界情况是NIL UUID,注意到这里。下面的正则表达式将考虑这一点,并将返回与NIL UUID匹配的值。请参见下面只接受非nil UUID的UUID。这两种解决方案都适用于版本1到5(请参阅第三块的第一个字符)。

因此,要验证UUID…

/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i

...确保您有一个规范格式化的UUID,版本1到5,并且是RFC4122中适当的变体。

注意:大括号{和}不是规范的。它们是一些系统和用途的产物。

容易修改以上正则表达式,以满足原问题的要求。

提示:regex group/ capturing

避免匹配NIL UUID:

/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i

以上答案稍作修改,以更简洁的方式书写。这将验证任何带有连字符的GUID(但是很容易修改为可选的连字符)。这也将支持大写和小写字符,这已经成为惯例,无论规范:

/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i

这里的关键是下面的重复部分

(([0-9a-fA-F]{4}\-){3})

它只是简单地重复4字符模式3次

在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版本,下面是相应的正则表达式。

注意,唯一的区别是版本号,这将在4.1.3中解释。UUID 4122 RFC的版本章节。

版本号是第三组的第一个字符:[VERSION_NUMBER][0-9A-F]{3}:

UUID v1: / ^ [0-9A-F] {8} - {4} [0-9A-F] [1] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v2: / ^ [0-9A-F] {8} - {4} [0-9A-F] [2] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v3: / ^ [0-9A-F] {8} - {4} [0-9A-F] [3] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v4: / ^ [0-9A-F] {8} - {4} [0-9A-F] [4] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v5: / ^ [0-9A-F] {8} - {4} [0-9A-F] [5] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我