如何测试有效的UUID/GUID?

Mar*_*era 224 javascript validation uuid guid

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

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

小智 367

目前,UUID是RFC4122中规定的.

因此要验证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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • +1提及[互联网工程任务组(IETF)](http://www.ietf.org) (6认同)
  • 出于好奇,(为什么)以下内容也不是有效的:`[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}- [0-9a-f]{4}-[0-9a-f]{12}` (4认同)
  • 我认为 [1-5][0-9a-f]{3} 不正确。我有一个有效的 UUID,其中该部分包含“b06a”,但这对我来说失败了。 (2认同)

con*_*bug 57

如果您使用 uuid 包,该包会带来一个布尔验证函数,它会告诉您 uuid 是否有效。

例子:

import { validate as isValidUUID } from 'uuid';

if (!isValidUUID(tx.originId)) {
  return Promise.reject('Invalid OriginID');
}
Run Code Online (Sandbox Code Playgroud)

  • 极好的!对于我们这些已经在 J​​S 中生成 UUID 的人来说,比公认的解决方案更好。 (3认同)

rya*_*anb 56

正义表达救援

/^[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');
Run Code Online (Sandbox Code Playgroud)

或括号

/^\{?[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}??\}?$/
Run Code Online (Sandbox Code Playgroud)

  • 更简洁的版本(忽略括号):`/ ^ [0-9a-f] {8} - ([0-9a-f] {4} - ){3} [0-9a-f] {12} $/i` (6认同)
  • 或者你可能有括号:/ ^\{?[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} \} $ /测试( '01234567-9ABC-DEF0-1234-56789ABCDEF0')?. (3认同)

小智 32

如果您使用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
Run Code Online (Sandbox Code Playgroud)


Iva*_*ele 28

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

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

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


Sou*_*ieb 21

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

Run Code Online (Sandbox Code Playgroud)

  • 您可以使用 .test() 而不是 .match() 并返回它。 (4认同)

Wol*_*olf 12

除了几乎在所有情况下都能完成这项工作的Gambol的答案之外,到目前为止给出的所有答案都错过了分组格式(8-4-4-4-12)对于在文本中编码GUID不是强制性的.它经常被使用,但显然32个十六进制数字的普通链也是有效的.[1] 正则表达式ENH:

/^[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$/i
Run Code Online (Sandbox Code Playgroud)

[1]所述的问题是关于校验荷兰国际集团变量 S,所以我们应该包括用户不友好的形式为好.


Eva*_*rds 10

到目前为止发布的所有特定于类型的正则表达式都失败了"类型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
Run Code Online (Sandbox Code Playgroud)

或者,为了在没有全零的情况下正确排除"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
Run Code Online (Sandbox Code Playgroud)

  • 您的看起来更好,但允许一些无效的 UUID,例如:`abcdef00-0000-0000-0000-000000000000` 将匹配您的正则表达式。此正则表达式将匹配有效的 UUID,包括 nil:`/^(?:[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` (2认同)

小智 9

如果您使用uuid包,您可以导入验证并将id传递给它

const { v4: uuidv4, validate } = require('uuid');

const { id } = request.params;
validate(id) ? true : false;
Run Code Online (Sandbox Code Playgroud)


小智 6

如果有人使用yup(JavaScript 模式验证器库),则可以使用以下代码来实现此功能。

const schema = yup.object().shape({
   uuid: yup.string().uuid()
 });
 const isValid = schema.isValidSync({uuid:"string"});
Run Code Online (Sandbox Code Playgroud)


Jam*_*son 5

上述答案的稍微修改版本以更简洁的方式编写。这将验证带有连字符的任何 GUID(但是可以轻松修改以使连字符可选)。这也将支持大写和小写字符,这已成为无论规范如何的约定:

/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
Run Code Online (Sandbox Code Playgroud)

这里的关键是下面重复的部分

(([0-9a-fA-F]{4}\-){3})
Run Code Online (Sandbox Code Playgroud)

简单地重复 4 个字符模式 3 次

  • 如果忽略大小写 (/i),为什么要重复 af 然后 AF? (6认同)