关于javascript:如何测试有效的UUID / GUID?

How to test valid UUID/GUID?

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

我目前只对验证类型1和4感兴趣,但对您的答案没有限制。


目前,uuid是在rfc4122中指定的。

因此要验证UUID…

1
/^[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,它是版本1到5,并且是符合RFC4122的适当变体。

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

容易修改上述regex以满足原始问题的要求。

提示:regex组/捕获


雷格克斯去营救

1
/^[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');

或者用括号

1
/^\{?[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}??\}?$/


如果您使用node.js进行开发,建议使用名为validator的包。它包括验证不同版本的uuid所需的所有regex,另外,您还可以获得用于验证的各种其他函数。

这是NPM链接:验证器

1
2
3
4
5
6
7
var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false


如果您想检查或验证特定的UUID版本,这里是相应的regex。

Note that the only difference is the version number, which is explained in 4.1.3. Version chapter of UUID 4122 RFC.

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

  • UUID V1:

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

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

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

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

    1
    /^[0-9A-F]{8}-[0-9A-F]{4}-[5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i

除了在几乎所有情况下都能完成任务的Gambol的答案外,迄今为止给出的所有答案都遗漏了,分组格式(8-4-4-4-12)不必强制将guid编码为文本。它的使用非常频繁,但显然32个十六进制数字的普通链也可以有效。

1
/^[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]问题是检查变量,所以我们也应该包括用户不友好的表单。

  • 为什么.NET GUID中有破折号?-堆栈溢出加上接受的答案
  • 测试和验证GUID(guid.us)
  • guid.toString方法(字符串)(msdn)


到目前为止发布的所有类型特定的regex在"type 0"nil uuid上都失败,在RFC的4.1.7中定义为:

The nil UUID is special form of UUID that is specified to have all 128 bits set to zero: 00000000-0000-0000-0000-000000000000

修改Wolf的答案:

1
/^[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",我们有以下内容(感谢卢克):

1
/^(?:[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的小方法。

1
2
3
public boolean isUUID(String s){
    return s.matches("^[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}$");
}


我认为更好的方法是使用静态方法fromstring来避免那些正则表达式。

1
2
3
    id = UUID.randomUUID();
    UUID uuid = UUID.fromString(id.toString());
    Assert.assertEquals(id.toString(), uuid.toString());

另一方面

1
   UUID uuidFalse = UUID.fromString("x");

throws java.lang.illegalargumentException:无效的UUID字符串:x


感谢@usertatha的修改

1
2
3
4
5
6
7
8
9
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;
}