如何检查变量是否包含有效的UUID / GUID标识符?
我目前只对验证类型1和类型4感兴趣,但它并不限制你的答案。
答案 0 :(得分:332)
目前,UUID是RFC4122中指定的。
因此要验证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
...确保您拥有版本1到5的规范格式化UUID,并且是符合RFC4122的相应变体。
注意:大括号{
和}
不是规范的。它们是某些系统和用法的工件。
易于修改上述正则表达式以满足原始问题的要求。
提示:正则表达式组/捕获
答案 1 :(得分:55)
regex to the rescue
/^[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}\}?$/
答案 2 :(得分:26)
如果您使用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
答案 3 :(得分:24)
如果要检查或验证特定的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
答案 4 :(得分:12)
除了Gambol's answer几乎在所有情况下 之外,所有给出的答案都错过了分组格式(8-4-4-4-12)不是强制性的到encode GUIDs in text。它经常被使用,但显然32个十六进制数字的普通链也是有效的。 [1] regex enh :< / p>
[1] 问题是检查 ing 变量,所以我们也应该包含用户不友好的表格。/^[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$/i
答案 5 :(得分:9)
到目前为止发布的所有特定于类型的正则表达式都失败了“类型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
或者,为了在没有全零的情况下正确排除“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
答案 6 :(得分:2)
检查String是否为UUID的小方法。
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}$");
}
答案 7 :(得分:2)
我认为Gambol's answer几乎是完美的,但对RFC 4122 § 4.1.1. Variant section的理解有些误解。
它涵盖Variant-1 UUID(10xx = 8..b),但不涵盖保留用于以下用途的Variant-0(0xxx = 0..7)和Variant-2(110x = c..d)变体向后兼容,因此它们在技术上是有效的UUID。实际上,变体4(111x = e..f)保留供将来使用,因此它们目前无效。
另外,0类型无效,如果它是NIL UUID(如Evan's answer中所述),则仅允许该“数字”为0。
因此,我认为符合当前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)
答案 8 :(得分:1)
感谢@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;
}
答案 9 :(得分:1)
对于Java ,以下是使用内置UUID库的解决方案:
public Boolean isUUID(String id) {
try {
UUID.fromString(id).toString().equals(id);
return true;
} catch (IllegalArgumentException | NullPointerException ex) {
return false;
}
}
答案 10 :(得分:0)
我认为更好的方法是使用静态方法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
答案 11 :(得分:0)
上述答案的简短修改版本,用较短的文字写成,这将验证任何带连字符的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次
答案 12 :(得分:0)
在Node中执行此操作的一种好方法是使用ajv
程序包(https://github.com/epoberezkin/ajv)。
const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefault: 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
答案 13 :(得分:0)
这是JS中的答案。感谢@userTatha
const isUUID = (uuid) => {
return uuid.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}$'
);
};