如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但这不应该成为您回答的限制。
如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但这不应该成为您回答的限制。
当前回答
如果您想检查或验证特定的UUID版本,下面是相应的正则表达式。
注意,唯一的区别是版本号,这将在4.1.3中解释。UUID 4122 RFC的版本章节。
版本号是第三组的第一个字符:[VERSION_NUMBER][0-9A-F]{3}:
UUID v1: / ^ [0-9A-F] {8} - {4} [0-9A-F] [1] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v2: / ^ [0-9A-F] {8} - {4} [0-9A-F] [2] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v3: / ^ [0-9A-F] {8} - {4} [0-9A-F] [3] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v4: / ^ [0-9A-F] {8} - {4} [0-9A-F] [4] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我 UUID v5: / ^ [0-9A-F] {8} - {4} [0-9A-F] [5] [0-9A-F] {3} - ab [89] [0-9A-F] {3} - [0-9A-F]{12} $ /我
其他回答
我认为更好的方法是使用静态方法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
如果您使用uuid包,这个包会带来一个布尔验证函数,它会告诉您uuid是否有效。
例子:
import { validate as isValidUUID } from 'uuid';
if (!isValidUUID(tx.originId)) {
return Promise.reject('Invalid OriginID');
}
我有这个函数,但本质上它和公认的答案是一样的。
export default function isUuid(uuid: string, isNullable: boolean = false): boolean {
return isNullable
? /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(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.test(uuid);
}
我认为Gambol的答案几乎是完美的,但它误解了RFC 4122§4.1.1。变型段有点。
它涵盖了变体-1 uuid (10xx = 8..b),但不包括为向后兼容性而保留的变体-0 (0xxx = 0..7)和变体-2 (110x = c..d)变体,因此它们在技术上是有效的uuid。变体4 (111x = e..f)确实是为将来使用而保留的,所以它们目前是无效的。
此外,0类型是无效的,“数字”只允许为0,如果它是NIL UUID(就像Evan的回答中提到的那样)。
所以我认为符合当前RFC 4122规范的最准确的正则表达式是(包括连字符):
/^([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)
如果您正在使用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