如何检查变量是否包含有效的UUID/GUID标识符?
我目前只关注验证类型1和4,但这不应限制你的答案。
如何检查变量是否包含有效的UUID/GUID标识符?
我目前只关注验证类型1和4,但这不应限制你的答案。
目前,UUID遵循RFC4122规范。经常被忽视的边缘情况是NIL UUID,可以在这里找到。下面的正则表达式将考虑到这一点,并返回一个NIL UUID的匹配项。请参见下面只接受非NIL UUID的UUID。这两个解决方案都适用于版本1到5(参见第三个块的第一个字符)。
因此要验证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
确保您拥有符合RFC4122标准的规范格式化UUID,该UUID是版本1到5,并且是适当的变体。
注意:括号{
和}
不是规范格式的。它们是一些系统和用法的产物。
很容易修改上述正则表达式以满足原始问题的要求。
提示:正则表达式组/捕获。
为避免匹配NIL 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
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
。 - tjeerdnet87f9
应该只以 [1-5]
开头,而 2977
应该只以 [ab89]
开头。在这里可以找到一个很好的解释:https://www.nearform.com/blog/new-crypto-capabilities-in-node-js/ - NeoNexus DeMortis如果您想检查或验证特定的UUID版本,以下是相应的正则表达式。
请注意唯一的区别是版本号,该版本号在 UUID 4122 RFC 的
4.1.3.版本
章节中有解释。
版本号是第三组的第一个字符:[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
正则表达式来拯救
/^[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}\}?$/
/^\{?[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');
此代码用于检查字符串是否符合指定格式,该格式为包含括号或不包含括号的标准 UUID(通用唯一标识符)格式。如果字符串符合该格式,则返回true。 - ryanb/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
的更简洁版本。 - c24w如果你在用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
/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i
和/或 /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
和/或 /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i
和/或 /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
。 - ruffinimport { validate as isValidUUID } from 'uuid';
if (!isValidUUID(tx.originId)) {
return Promise.reject('Invalid OriginID');
}
感谢 @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;
}
除了Gambol的回答几乎适用于所有情况,到目前为止给出的所有答案都忽略了分组格式(8-4-4-4-12)不是必须的,在文本中编码GUIDs。它被广泛使用,但显然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]问题是关于检查变量的,因此我们也应该包含不太用户友好的形式。
{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?
- mike nelson到目前为止,所有特定类型的正则表达式都未能匹配“type 0”Nil UUID。在RFC 4.1.7中定义了它:
Nil UUID是UUID的一种特殊形式,它被指定为所有128位均设置为零:
00000000-0000-0000-0000-000000000000
修改Wolf的答案:
/^[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
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
。 - Lukeconst { v4: uuidv4, validate } = require('uuid');
const { id } = request.params;
validate(id) ? true : false;
const schema = yup.object().shape({
uuid: yup.string().uuid()
});
const isValid = schema.isValidSync({uuid:"string"});