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

目前,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链接:

除此之外,几乎在所有情况下,所有给出的答案都会遗漏,因此分组格式(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):


如果您想检查或验证特定的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}$");
}

感谢@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:Invalid UUID string:x

以更简洁的方式编写的上述答案的稍微修改版本。这将使用连字符验证任何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次,我认为这几乎是完美的,但它有点误解了

它包括变体1 UUID(10xx=8..b),但不包括为向后兼容性保留的变体0(0xxx=0..7)和变体2(110x=c..d),因此它们是技术上有效的UUID。变型-4(111x=e..f)确实保留供将来使用,因此它们目前无效

另外,0类型无效,只有当“digit”是NIL UUID时才允许为0(如中所述)

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


在节点中执行此操作的一个好方法是使用
ajv
包()


用字符串格式,不是十六进制,不是bin,或者我不知道你要什么^({0,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}(\}){0,1}$?[0-9a-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-F[[0-9-9 A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-F-F[0-A-A-F-F[0-A-A-F-fA-F[0-A-A-A-F[0-A-A-F[0-A-A-A-A-A-F-fA-F[0-F[0-A-A-A-A-A-A-A-A-A-A-A-A-fA-F-F[[[[[[0-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-A-fA-F[F[F]}[0-9a-F]{12} $/i我认为[1-5][0-9a-f]{3}是不正确的。我有一个有效的UUID,该部分有“b06a”,这对我来说是失败的。@FelipeBrahm[1-5]根据RFC是正确的,4位表示版本,只有5个版本。749d0000-0194-1005-2e05-08D6163BF2F在小提琴中对我来说是失败的,出于好奇,(为什么)以下内容是否也有效:
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
@mshaffer第21行,第二个正则表达式定义似乎不正确,第一个可以验证空正则表达式和robs正则表达式,第二个定义无法验证。这是我最喜欢的一个。更好的是
[0-9a-f]{8-9a-f]{0-9a-f]{5}-[0-5}{?[89ab][0-9a-9a-a-f(0-9a-9a-f){{{12}}}?有趣,但它看起来很有趣,但它看起来像是期望菌丝?????<<代码>/^[0-9a-9a-a-f(0-9a-9a-a-a-f)有趣,但它看起来是有趣,但它期待它期望菌丝?????????<<代码><<<代码>/^[0-0-9-9-9a-9a-9-9-a-a-a-a-f{{{[0-9-9-9-f{{{{{{{{{8}-8}-8}-8}-8}-8}-[0-8}-[0-8}-[0-9-9-9-9-9-9-8}-8}-8}-[0-9-9-9-[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
和/或
/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
验证程序只支持UUID v3-5而不是v1。nil UUID的第一个UUID段应该有8个零,而不是7个。regex提供的没有
   UUID uuidFalse = UUID.fromString("x");
/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
(([0-9a-fA-F]{4}\-){3})
/^([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)
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefaults: 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