UUIDを検証する正規表現

UUIDバリデーション用の正規表現パターンを網羅的に解説。バージョン別の厳密な検証、大文字・小文字の扱い、よくある正規表現の落とし穴を紹介します。

Format

詳細な説明

正規表現による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);
}

よくある落とし穴:

  1. 大文字・小文字の区別を忘れる: UUIDは大文字・小文字を区別しません。常に i フラグを使用するか、文字クラスに A-F を含めてください。
  2. アンカーなしでのマッチング: ^$ がないと、正規表現はより長い文字列中に埋め込まれたUUIDにマッチする可能性があります。
  3. 有効な形式の拒否: 一部のシステムはハイフンなしやURN形式(urn:uuid:...)でUUIDを出力します。どの形式を受け入れるか事前に決めてください。
  4. 過度な検証: ほとんどのアプリケーションでは汎用フォーマットチェックで十分です。バージョン/バリアントの検証はRFC準拠を保証する必要がある場合にのみ必要です。

パフォーマンスに関する注意: 大量のバリデーション(数百万行のログ解析など)では、単純な長さ+文字チェックが正規表現よりも高速な場合があります。長さが36であること、位置8、13、18、23にハイフンがあること、その他の文字がすべて16進数字であることを検証します。

ユースケース

UUIDの正規表現バリデーションは、APIの入力サニタイズにおいてインジェクション攻撃を防ぎ、ユーザーが提供した識別子がデータベース検索前に期待されるフォーマットに準拠していることを確認するために不可欠です。

試してみる — UUID Generator

フルツールを開く