UUIDを検証する正規表現
UUIDバリデーション用の正規表現パターンを網羅的に解説。バージョン別の厳密な検証、大文字・小文字の扱い、よくある正規表現の落とし穴を紹介します。
詳細な説明
正規表現によるUUIDの検証は、入力バリデーション、ログ解析、データクレンジングにおいてよく行われる処理です。適切な正規表現は、どの程度厳密な検証が必要かによって異なります。
汎用UUID正規表現(全バージョン対応):
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
これは8-4-4-4-12の16進数フォーマットに一致しますが、バージョンやバリアントビットの検証は行いません。大文字・小文字を区別しないマッチングには i フラグを使用してください。
厳密なRFC準拠の正規表現(バージョン1-7、正しいバリアント):
^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
これはバージョン桁(グループ3の最初の16進数字)が1-7であること、バリアント桁(グループ4の最初の16進数字)が8、9、a、bであることを確認します。
バージョン別の正規表現:
// UUID v4 only
^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
// UUID v7 only
^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
Nil UUIDとMax UUIDを含める場合:
Nil UUID(00000000-0000-0000-0000-000000000000)とMax UUID(ffffffff-ffff-ffff-ffff-ffffffffffff)を受け入れる必要がある場合、上記の厳密な正規表現ではバージョンとバリアントのビットが一致しないため拒否されます。特別なケースとして処理してください:
function isValidUuid(str) {
if (str === '00000000-0000-0000-0000-000000000000') return true;
if (str === 'ffffffff-ffff-ffff-ffff-ffffffffffff') return true;
return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-7][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(str);
}
よくある落とし穴:
- 大文字・小文字の区別を忘れる: UUIDは大文字・小文字を区別しません。常に
iフラグを使用するか、文字クラスにA-Fを含めてください。 - アンカーなしでのマッチング:
^と$がないと、正規表現はより長い文字列中に埋め込まれたUUIDにマッチする可能性があります。 - 有効な形式の拒否: 一部のシステムはハイフンなしやURN形式(
urn:uuid:...)でUUIDを出力します。どの形式を受け入れるか事前に決めてください。 - 過度な検証: ほとんどのアプリケーションでは汎用フォーマットチェックで十分です。バージョン/バリアントの検証はRFC準拠を保証する必要がある場合にのみ必要です。
パフォーマンスに関する注意: 大量のバリデーション(数百万行のログ解析など)では、単純な長さ+文字チェックが正規表現よりも高速な場合があります。長さが36であること、位置8、13、18、23にハイフンがあること、その他の文字がすべて16進数字であることを検証します。
ユースケース
UUIDの正規表現バリデーションは、APIの入力サニタイズにおいてインジェクション攻撃を防ぎ、ユーザーが提供した識別子がデータベース検索前に期待されるフォーマットに準拠していることを確認するために不可欠です。