How to test valid UUID/GUID?
如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但对您的答案没有限制。
目前,uuid是在rfc4122中指定的。
因此要验证UUID…
1 | /^[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,它是版本1到5,并且是符合RFC4122的适当变体。
注:括号
容易修改上述regex以满足原始问题的要求。
提示:regex组/捕获
雷格克斯去营救
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}$/.test('01234567-9ABC-DEF0-1234-56789ABCDEF0'); |
或者用括号
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}??\}?$/ |
如果您使用node.js进行开发,建议使用名为validator的包。它包括验证不同版本的uuid所需的所有regex,另外,您还可以获得用于验证的各种其他函数。
这是NPM链接:验证器
1 2 3 4 5 6 7 | var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2' v.isUUID(a) true v.isUUID('abc') false v.isNull(a) false |
如果您想检查或验证特定的UUID版本,这里是相应的regex。
Note that the only difference is the version number, which is explained in
4.1.3. Version chapter of UUID 4122 RFC.
版本号是第三组的第一个字符:
UUID V1:
1/^[0-9A-F]{8}-[0-9A-F]{4}-[1][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/iUUID V2:
1/^[0-9A-F]{8}-[0-9A-F]{4}-[2][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/iUUID V3:
1/^[0-9A-F]{8}-[0-9A-F]{4}-[3][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/iUUID V4:
1/^[0-9A-F]{8}-[0-9A-F]{4}-[4][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/iUUID V5:
1/^[0-9A-F]{8}-[0-9A-F]{4}-[5][0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
除了在几乎所有情况下都能完成任务的Gambol的答案外,迄今为止给出的所有答案都遗漏了,分组格式(8-4-4-4-12)不必强制将guid编码为文本。它的使用非常频繁,但显然32个十六进制数字的普通链也可以有效。
1 | /^[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]问题是检查变量,所以我们也应该包括用户不友好的表单。
- 为什么.NET GUID中有破折号?-堆栈溢出加上接受的答案
- 测试和验证GUID(guid.us)
- guid.toString方法(字符串)(msdn)
到目前为止发布的所有类型特定的regex在"type 0"nil uuid上都失败,在RFC的4.1.7中定义为:
The nil UUID is special form of UUID that is specified to have all 128 bits set to zero:
00000000-0000-0000-0000-000000000000
修改Wolf的答案:
1 | /^[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",我们有以下内容(感谢卢克):
1 | /^(?:[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 |
检查字符串是否为UUID的小方法。
1 2 3 | 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}$"); } |
我认为更好的方法是使用静态方法fromstring来避免那些正则表达式。
1 2 3 | id = UUID.randomUUID(); UUID uuid = UUID.fromString(id.toString()); Assert.assertEquals(id.toString(), uuid.toString()); |
另一方面
1 | UUID uuidFalse = UUID.fromString("x"); |
throws java.lang.illegalargumentException:无效的UUID字符串:x
感谢@usertatha的修改
1 2 3 4 5 6 7 8 9 | 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; } |