정규식 개요
UUID를 검사하는 정규식은 보통 두 가지로 나뉩니다. 길이와 문자 종류만 보는 느슨한 패턴과, 13번째 자리의 버전과 17번째 자리의 변형까지 확인하는 엄격한 패턴입니다.
느슨한 패턴은 로그에서 UUID처럼 생긴 문자열을 찾아낼 때 쓰고, 엄격한 패턴은 실제로 쓸 수 있는 값인지 판단할 때 씁니다. 이 도구는 두 결과를 나란히 보여줍니다.
사용 방법
- 테스트할 값을 한 줄에 하나씩 붙여넣습니다. 최대 200줄입니다.
- 정규식 테스트를 누릅니다.
- 줄마다 어느 패턴에 맞는지 표시됩니다.
- 엄격한 패턴에만 통과한 값이 실제로 유효한 UUID입니다.
사용 사례
- 로그 파서에 넣을 정규식을 미리 검증할 때.
- 값을 받아들이기 전에 클라이언트 쪽에서 걸러낼 때.
- 빅쿼리나 데이터 파이프라인에서 UUID 컬럼을 추려낼 때.
구조
엄격한 패턴은 13번째 자리에서 1~8을, 17번째 자리에서 8, 9, a, b만 허용합니다. 이 두 자리가 UUID의 버전과 변형을 나타냅니다.
정규식의 역할
| 옵션 | 사용 시점 |
|---|---|
정규식 | 직접 패턴을 확인해 볼 때 |
검증 | 패턴 해석 없이 값만 확인할 때 |
일괄 생성 | 검증할 값을 대량으로 만들 때 |
UUID 버전 한눈에 보기
| 버전 | 정렬 가능 | 값의 출처 | 적합한 용도 |
|---|---|---|---|
| v1 | 불가능 | 타임스탬프 + MAC 주소 | v1을 계속 쓰는 기존 시스템 |
| v3 | 불가능 | 이름의 MD5 해시 | MD5를 꼭 써야 하는 결정적 식별자 |
| v4 | 불가능 | 122비트 난수 | 대부분의 일반적인 고유 식별자 |
| v5 | 불가능 | 이름의 SHA-1 해시 | 같은 이름에서 항상 같은 식별자가 필요할 때 |
| v6 | 가능 | 재배열한 타임스탬프 | 난수성과 정렬을 함께 원할 때 |
| v7 | 가능 | 밀리초 단위 Unix 시간 | 데이터베이스 기본 키와 이벤트 식별자 |
| v8 | 불가능 | 사용자 정의 비트 레이아웃 | 사내 형식과 실험적 용도 |
일곱 버전 모두 128비트이고, 모두 같은 8-4-4-4-12 표기법으로 표현합니다. 차이는 각 비트가 무엇을 담는지뿐입니다.
코드 예제
javascript
// 느슨한 패턴: 형식만 확인합니다
const loose = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
// 엄격한 패턴: 버전과 변형까지 확인합니다
const strict = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
python
import re
STRICT = re.compile(r'^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}'
r'-[89ab][0-9a-f]{3}-[0-9a-f]{12}$', re.I)
bool(STRICT.match(value))
java
var strict = Pattern.compile(
"^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-"
+ "[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
Pattern.CASE_INSENSITIVE);
csharp
var strict = new Regex(
"^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-"
+ "[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
RegexOptions.IgnoreCase);
sql
-- PostgreSQL 13+
WHERE value ~* '^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$';
자주 묻는 질문
느슨한 패턴과 엄격한 패턴의 차이는 무엇인가요?
느슨한 패턴은 길이와 문자 종류만 보고, 엄격한 패턴은 버전과 변형 자리까지 확인합니다. 형식은 맞지만 버전 자리가 규격 밖인 값을 걸러내려면 엄격한 패턴이 필요합니다.
버전 자리는 왜 1~8인가요?
RFC 9562가 버전 1부터 8까지를 정의했기 때문입니다. 0은 사용하지 않고 9 이상은 예약되어 있습니다.
변형 자리는 왜 8, 9, a, b인가요?
RFC 4122 / 9562 호환 변형을 나타내는 값이 앞 두 비트 10이기 때문입니다. 그래서 16진수로 8부터 b까지가 됩니다.