如何测试有效的 UUID/GUID?

IT技术 javascript regex validation uuid guid
2021-02-09 12:12:52

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

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

6个回答

目前,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,它是版本 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
749d0000-0194-1005-2e05-08d61613bf2f 对我来说失败了
2021-03-14 12:12:52
出于好奇,(为什么)以下内容也无效: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
2021-03-18 12:12:52
@mshaffer 第 21 行,第二个正则表达式定义似乎不正确,第一个没问题 - 验证 empty 和 robs regex,第二个 def 无法做到。
2021-03-29 12:12:52
我认为 [1-5][0-9a-f]{3} 是不正确的。我有一个有效的 UUID,在那部分有“b06a”,这对我来说失败了。
2021-04-06 12:12:52
@FelipeBrahm,[1-5] 根据 RFC 是正确的,4 位表示版本,只有 5 个版本。
2021-04-09 12:12:52

正则表达式来救援

/^[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-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
2021-03-16 12:12:52
或者如果您可能有括号: /^\{?[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');
2021-03-17 12:12:52
这不太正确。它错过了 [1-5] (version) 开始第三个块和 [89AB] (variant) 开始第四个块。Gambol 的回答是正确的。
2021-03-23 12:12:52

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

请注意,唯一的区别是版本号,这在UUID 4122 RFC 的4.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
    
有趣的是,我有一个由 C# 创建的 Guid,它与其中任何一个都不匹配,因为它有一个“c”,正则表达式需要 8,9,A 或 B。
2021-04-11 12:12:52

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

这是 npm 链接:验证器

var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false
有趣,但看起来它需要连字符?这是它当前使用的四个正则表达式--/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i 和/或 /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i 和/或 /^[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
2021-03-16 12:12:52
验证器仅支持 UUID v3-5 不支持 v1
2021-03-28 12:12:52

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

您可以使用 .test() 而不是 .match() 并返回它。
2021-03-16 12:12:52