如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但这不应该成为您回答的限制。
如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但这不应该成为您回答的限制。
当前回答
如果您使用uuid包,这个包会带来一个布尔验证函数,它会告诉您uuid是否有效。
例子:
import { validate as isValidUUID } from 'uuid';
if (!isValidUUID(tx.originId)) {
return Promise.reject('Invalid OriginID');
}
其他回答
如果有人使用yup, JavaScript模式验证器库,此功能可以通过以下代码实现。
const schema = yup.object().shape({
uuid: yup.string().uuid()
});
const isValid = schema.isValidSync({uuid:"string"});
感谢@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;
}
以上答案稍作修改,以更简洁的方式书写。这将验证任何带有连字符的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次
我认为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)
使用.match()方法检查String是否为UUID。
public boolean isUUID(String s){
return 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}$");
}