如何测试有效的UUID / GUID?

时间:2011-10-26 16:40:49

标签: javascript validation guid uuid

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

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

14 个答案:

答案 0 :(得分:332)

目前,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的相应变体。

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

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

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

答案 1 :(得分:55)

regex to the rescue

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

答案 2 :(得分:26)

如果您使用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

答案 3 :(得分:24)

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

  

请注意唯一的区别是版本号UUID 4122 RFC4.1.3. Version一章对此进行了解释。

版本号是第三组的第一个字符:[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
    
  • UUID v4:

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

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

答案 4 :(得分:12)

除了Gambol's answer几乎在所有情况下 之外,所有给出的答案都错过了分组格式(8-4-4-4-12)不是强制性的到encode GUIDs in text。它经常被使用,但显然32个十六进制数字的普通链也是有效的。 [1] regex enh :< / p>

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

答案 5 :(得分:9)

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

  

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

修改沃尔夫的答案:

/^[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型”,我们有以下内容(感谢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

答案 6 :(得分:2)

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

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

答案 7 :(得分:2)

我认为Gambol's answer几乎是完美的,但对RFC 4122 § 4.1.1. Variant section的理解有些误解。

它涵盖Variant-1 UUID(10xx = 8..b),但不涵盖保留用于以下用途的Variant-0(0xxx = 0..7)和Variant-2(110x = c..d)变体向后兼容,因此它们在技术上是有效的UUID。实际上,变体4(111x = e..f)保留供将来使用,因此它们目前无效。

另外,0类型无效,如果它是NIL UUID(如Evan's answer中所述),则仅允许该“数字”为0。

因此,我认为符合当前RFC 4122规范的最准确的正则表达式是(包括连字符):

/^([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[0-9a-d][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i
                            ^                ^^^^^^
                    (0 type is not valid)  (only e..f variant digit is invalid currently)

答案 8 :(得分:1)

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

答案 9 :(得分:1)

对于Java ,以下是使用内置UUID库的解决方案:

public Boolean isUUID(String id) {
    try {
        UUID.fromString(id).toString().equals(id);
        return true;
    } catch (IllegalArgumentException | NullPointerException ex) {
        return false;
    }
}

答案 10 :(得分:0)

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

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

另一方面

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

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

答案 11 :(得分:0)

上述答案的简短修改版本,用较短的文字写成,这将验证任何带连字符的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次

答案 12 :(得分:0)

在Node中执行此操作的一种好方法是使用ajv程序包(https://github.com/epoberezkin/ajv)。

const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefault: 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

答案 13 :(得分:0)

这是JS中的答案。感谢@userTatha

const isUUID = (uuid) => {
  return uuid.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}$'
 );
};