如何检查变量是否包含有效的UUID/GUID标识符?
我目前只对验证类型1和4感兴趣,但对您的答案没有限制。
用什么格式????
字符串格式,不是十六进制,不是bin,或者我不知道你要什么
^( 0,1[0-9a-fa-f]8 -[0-9a-fa-f-f]4 4 ;0,1$
如果不能排除包含32个连续十六进制数字链(不分组)的变量,请看我的答案。
目前,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
…确保您有一个规范格式的UUID,它是版本1到5,并且是符合RFC4122的适当变体。
注:括号{和}不规范。它们是一些系统和用途的产物。
容易修改上述regex以满足原始问题的要求。
提示:regex组/捕获
+1提及互联网工程工作组(IETF)
我认为[1-5][0-9a-f]3是错误的。我有一个有效的UUID,在那个部分有"b06a",这对我来说是失败的。
@felipebrahm[1-5]是对的,根据RFC,4位表示版本,只有5个版本。
玩弄实现:jsfiddle.net/mshaffer/6e2ljh97
749D0000-0194-1005-2E05-08D61613BF2F在小提琴中为我失败
雷格克斯去营救
/^[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‌&8203;]4-[0-9a-fa-f]12 zwnj;&8203;?$/.test('01234567‌&8203;-9abc-def0-1234-5678‌&8203;9abcdef0');
这不太正确。它忽略了[1-5](版本)启动第三个块,而[89AB](变量)启动第四个块。甘波尔的回答是对的。
更简洁的版本(忽略括号):/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i。
如果您使用node.js进行开发,建议使用名为validator的包。它包括验证不同版本的uuid所需的所有regex,另外,您还可以获得用于验证的各种其他函数。
这是NPM链接:验证器
var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false
有意思,但看起来需要连字符?下面是它当前使用的四个regex——/^[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。
验证程序只支持UUID v3-5,不支持v1
如果您想检查或验证特定的UUID版本,这里是相应的regex。
Note that the only difference is the version number, which is explained in 4.1.3. Version chapter of UUID 4122 RFC.
版本号是第三组的第一个字符:[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
除了在几乎所有情况下都能完成任务的Gambol的答案外,迄今为止给出的所有答案都遗漏了,分组格式(8-4-4-4-12)不必强制将guid编码为文本。它的使用非常频繁,但显然32个十六进制数字的普通链也可以有效。
/^[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)
这是我的最爱。更好的是{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?。
到目前为止发布的所有类型特定的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的答案:
/^[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",我们有以下内容(感谢卢克):
/^(?:[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
nil uuid的第一个uuid段应该有8个零,而不是7个。提供的regex没有用7验证它。
您的看起来更好,但允许一些无效的UUID,例如:abcdef00-0000-0000-0000-000000000000将匹配您的regex。此regex将匹配有效的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。
检查字符串是否为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}$");
}
未捕获的类型错误:s.matches不是函数
给定的脚本不是javascript,这是OP要求的。
我认为更好的方法是使用静态方法fromstring来避免那些正则表达式。
id = UUID.randomUUID();
UUID uuid = UUID.fromString(id.toString());
Assert.assertEquals(id.toString(), uuid.toString());
另一方面
UUID uuidFalse = UUID.fromString("x");
throws java.lang.illegalargumentException:无效的UUID字符串:x
感谢@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;
}