Javascript 如何测试有效的UUID/GUID?

Javascript 如何测试有效的UUID/GUID?,javascript,regex,validation,uuid,guid,Javascript,Regex,Validation,Uuid,Guid,如何检查变量是否包含有效的UUID/GUID标识符 我目前只对验证类型1和4感兴趣,但这不应该限制您的答案。regex /^[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-f

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

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

regex

/^[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}‌​\}?$/
雷格克斯拯救

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

目前,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,该UUID版本为1到5,是RFC4122规定的适当变体

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

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

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

要避免匹配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如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,该UUID版本为1到5,是RFC4122规定的适当变体

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

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

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

要避免匹配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

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

以下是npm链接:


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

以下是npm链接:

除此之外,几乎在所有情况下,所有给出的答案都会遗漏,因此分组格式(8-4-4-4-12)不是必须的。它的使用非常频繁,但显然,由32个十六进制数字组成的普通链也是有效的。[1]regexenh:


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

  • 加上
  • (美国)
  • (MSDN)
除此之外,几乎在所有情况下都可以这样做,迄今为止给出的所有答案都遗漏了分组格式(8-4-4-4-12)。它的使用非常频繁,但显然,由32个十六进制数字组成的普通链也是有效的。[1]regexenh:


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

  • 加上
  • (美国)
  • (MSDN)

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

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”,我们有以下内容(感谢Luke):


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

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”,我们有以下内容(感谢Luke):


如果您想检查或验证特定的UUID版本,下面是相应的正则表达式

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

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

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

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

版本号是第三组的第一个字符:
[版本号][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
    
使用.match()方法检查字符串是否为UUID

public boolean isUUID(String s){
    return 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}$");
}
使用.match()方法检查字符串是否为UUID

public boolean isUUID(String s){
    return 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}$");
}

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


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


我认为更好的方法是使用静态方法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

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

    id = UUID.randomUUID();
    UUID uuid = UUID.fromString(id.toString());
    Assert.assertEquals(id.toString(), uuid.toString());
另一方面

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

抛出java.lang.IllegalArgumentException:Invalid UUID string:x

以更简洁的方式编写的上述答案的稍微修改版本。这将使用连字符验证任何GUID(无论如何轻松修改以使连字符成为可选的)。这也将支持已成为惯例的大写和小写字符