如何检查变量是否包含有效的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

其他回答

正则表达式来拯救

/^[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}‌​\}?$/

我向Apache Commons validator添加了一个UUID验证器。它还没有合并,但你可以在这里投票:

https://github.com/apache/commons-validator/pull/68

感谢@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;
}

目前,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

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

例子:

import { validate as isValidUUID } from 'uuid';

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