如何测试有效的UUID / GUID?

问题描述 投票:203回答:9

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

我目前只对验证类型1和类型4感兴趣,但它并不限制你的答案。

javascript validation guid uuid
9个回答
349
投票

目前,UUID是RFC4122中规定的。

因此要验证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

...确保您拥有版本1到5的规范格式化UUID,并且是符合RFC4122的相应变体。

注意:括号{}不是规范的。它们是某些系统和用法的工件。

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

提示:正则表达式组/捕获


55
投票

正义表达救援

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

28
投票

如果您使用Node.js进行开发,建议使用名为Validator的包。它包括验证不同版本UUID所需的所有正则表达式,另外还有各种其他功能可供验证。

这是npm链接:Validator

var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false

25
投票

如果要检查或验证特定的UUID版本,请使用以下相应的正则表达式。

请注意,唯一的区别是版本号,4.1.3. VersionUUID 4122 RFC章节对此进行了解释。

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

  • UUID v1: /^[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: /^[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: /^[0-9A-F]{8}-[0-9A-F]{4}-[3][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
  • UID RF: yaazkssvpoi
  • UUID v5: /^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i

12
投票

除了几乎在所有情况下都能完成工作的/^[0-9A-F]{8}-[0-9A-F]{4}-[5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i 之外,到目前为止给出的所有答案都错过了分组格式(8-4-4-4-12)对Gambol's answer不是强制性的。它经常被使用,但显然32个十六进制数字的普通链也是有效的。[1] regexenh:

encode GUIDs in text

[1]问题是关于检查变量,所以我们也应该包括用户不友好的形式。


9
投票

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

nil UUID是UUID的特殊形式,指定将所有128位设置为零:Guid.ToString Method (String)

修改沃尔夫的答案:

00000000-0000-0000-0000-000000000000

或者,为了在没有全零的情况下正确排除“0型”,我们有以下内容(感谢Luke):

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

2
投票

检查String是否为UUID的小方法。

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

1
投票

感谢@usertatha做了一些修改

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}$");
}

0
投票

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

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;
}

另一方面

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

抛出java.lang.IllegalArgumentException:无效的UUID字符串:x

© www.soinside.com 2019 - 2024. All rights reserved.