web-dev-qa-db-ja.com

有効なUUID / GUIDをテストする方法は?

変数に有効なUUID/GUID識別子が含まれているかどうかを確認する方法は?

現在、タイプ1と4の検証のみに関心がありますが、回答の制限はありません。

205
Marek Sebera

現在、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

...バージョン1から5であり、RFC4122に準拠した適切なバリアントである標準形式のUUIDがあることを確認します。

注:中括弧{および}は正規ではありません。それらは、一部のシステムおよび使用法の成果物です。

元の質問の要件を満たすために上記の正規表現を簡単に変更できます。

ヒント:正規表現グループ/キャプチャ

333
Gambol

救助への正規表現

/^[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}‌​\}?$/
55
ryanb

開発にNode.jsを使用している場合、Validatorというパッケージを使用することをお勧めします。 UUIDの異なるバージョンを検証するために必要なすべての正規表現に加えて、検証のためのさまざまな他の関数を取得します。

Npmリンクは次のとおりです。 Validator

var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false
26
Neeraj Sharma

特定のUUIDバージョンを確認または検証する場合は、対応する正規表現を以下に示します。

唯一の違いはバージョン番号であり、これは ID 4122 RFC4.1.3. Version章で説明されていることに注意してください。

バージョン番号は、3番目のグループの最初の文字です:[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
    
24
Ivan Gabriele

Gambol's answer に加えて、ほぼすべての場合にジョブを実行します -12)は必須ではありません テキストのGUIDのエンコード 。非常に頻繁に使用されますが、明らかに32桁の16進数のプレーンチェーンも有効です。[1] 正規表現えー

/^[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] 問題はcheckingvariablesであるため、ユーザーフレンドリーでないフォームも含める必要があります。

12
Wolf

これまでに投稿されたすべてのタイプ固有の正規表現は、RFC 4.1.7で次のように定義されている「タイプ0」Nil UUIDで失敗しています。

Nil UUIDは、128ビットすべてをゼロに設定するように指定された特別な形式のUUIDです:00000000-0000-0000-0000-000000000000

ウルフの答えを修正するには:

/^[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
9
Evan Edwards

Stringが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}$");
}
2
userTatha

@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;
}

1
Souhaieb

より良い方法は、静的メソッドfromStringを使用してこれらの正規表現を避けることだと思います。

    id = UUID.randomUUID();
    UUID uuid = UUID.fromString(id.toString());
    Assert.assertEquals(id.toString(), uuid.toString());

一方

   UUID uuidFalse = UUID.fromString("x");

java.lang.IllegalArgumentExceptionがスローされます:無効なUUID文字列:x

0