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

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


当前回答

到目前为止发布的所有类型特定的正则表达式在“type 0”Nil UUID上都失败了,在RFC的4.1.7中定义为:

nil UUID是UUID的特殊形式,指定所有128位都设置为零:00000000-0000-0000- 000000000000

修改一下Wolf的回答:

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

或者,为了正确地排除没有全0的“类型0”,我们有以下(感谢Luke):

/^(?:[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

其他回答

如果使用uuid包,可以导入验证并将id传递给它

const { v4: uuidv4, validate } = require('uuid');

const { id } = request.params;
validate(id) ? true : false;

感谢@usertatha做了一些修改

function isUUID ( uuid ) {
    let s = "" + uuid;

    s = 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}$');
    if (s === null) {
      return false;
    }
    return true;
}

以上答案稍作修改,以更简洁的方式书写。这将验证任何带有连字符的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

如果有人使用yup, JavaScript模式验证器库,此功能可以通过以下代码实现。

const schema = yup.object().shape({
   uuid: yup.string().uuid()
 });
 const isValid = schema.isValidSync({uuid:"string"});