如何验证一个字符串是否是合法的 UUID
UUID 的标准格式规则
合法的 UUID 必须满足以下格式要求:总长度 36 个字符;由 5 个用连字符(-)分隔的组构成,格式为 8-4-4-4-12(各组的十六进制字符数);只能包含十六进制字符(0-9 和 a-f,大小写均可)和连字符;第三组的第一个字符是版本号(1-7,对应 UUID 版本 1 到 7);第四组的第一个字符是变体标识(8、9、a 或 b 对应 RFC 4122 变体)。典型合法 UUID:550e8400-e29b-41d4-a716-446655440000。
正则表达式验证
# 宽松模式(只检查格式,不检查版本和变体)
^[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}$
# 严格模式(检查格式 + 版本 1-7 + RFC 4122 变体)
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-7][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
# 只接受 UUID v4(最常用)
^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$
# 全小写严格格式(RFC 4122 推荐)
^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
各编程语言的验证实现
# Python
import uuid, re
def validate_uuid(s: str) -> bool:
"""使用标准库验证 UUID"""
try:
uuid.UUID(s)
return True
except ValueError:
return False
def validate_uuid_v4(s: str) -> bool:
"""验证是否是 UUID v4"""
try:
u = uuid.UUID(s)
return u.version == 4
except ValueError:
return False
# JavaScript / TypeScript
function isUUID(str) {
const pattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
return pattern.test(str);
}
// Java
import java.util.UUID;
static boolean isUUID(String s) {
try { UUID.fromString(s); return true; }
catch (IllegalArgumentException e) { return false; }
}
// Go
import "regexp"
var uuidRegex = regexp.MustCompile(
`^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-7][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$`,
)
func isUUID(s string) bool { return uuidRegex.MatchString(s) }
从 UUID 中提取版本信息
# Python:从 UUID 字符串提取版本
import uuid
def get_uuid_version(uuid_str: str) -> int:
try:
u = uuid.UUID(uuid_str)
return u.version
except ValueError:
return -1 # 非法格式
# 直接从字符串提取(不解析对象)
def get_uuid_version_fast(uuid_str: str) -> str:
"""从字符串第15位(0-indexed)读取版本"""
if len(uuid_str) == 36 and uuid_str[14] in '1234567':
return uuid_str[14]
return 'unknown'
# 示例
ids = [
'550e8400-e29b-11d4-a716-446655440000', # v1
'550e8400-e29b-41d4-a716-446655440000', # v4
'550e8400-e29b-71d4-a716-446655440000', # v7
]
for uid in ids:
print(f"{uid}: version {get_uuid_version(uid)}")
处理变体格式的 UUID
在实际应用中,可能遇到多种 UUID 格式变体需要验证或标准化:带花括号的 GUID 格式({550e8400-e29b-41d4-a716-446655440000});无连字符的紧凑格式(550e8400e29b41d4a716446655440000);大写格式(550E8400-E29B-41D4-A716-446655440000)。标准化这些格式的最佳做法是:先移除花括号,统一转为小写,检查长度(36 字符带连字符,32 字符不带),再验证格式。Python 的 uuid.UUID() 构造函数接受所有这些变体,会自动标准化。
在 API 中验证 UUID 路径参数
# FastAPI / Python 自动验证
from uuid import UUID
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
async def get_item(item_id: UUID):
# FastAPI 自动验证 item_id 格式,格式错误返回 422
return {"id": str(item_id)}
# Express / Node.js 中间件验证
const { validate: isUuid } = require('uuid');
function validateUUIDParam(req, res, next) {
const { id } = req.params;
if (!isUuid(id)) {
return res.status(400).json({
error: 'Invalid UUID format',
received: id
});
}
next();
}
app.get('/users/:id', validateUUIDParam, (req, res) => {
// 此处 req.params.id 是合法 UUID
});
Nil UUID 和特殊 UUID
有几个特殊的 UUID 值需要了解:Nil UUID(全零 UUID:00000000-0000-0000-0000-000000000000)是 RFC 4122 定义的"空"UUID,类似于 null,通常用于表示"无 ID";Max UUID(全 F:ffffffff-ffff-ffff-ffff-ffffffffffff)是 RFC 9562 定义的最大 UUID。在验证时,如果你的业务不接受 Nil UUID,需要额外检查:确保字符串不是全零。某些系统用 Nil UUID 作为默认值,需要特别处理。
立即免费使用相关工具
免费使用 →