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


270

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

私は現在、タイプ1と4の検証のみに関心がありますが、それはあなたの回答に対する制限ではありません。


文字列形式、16進数ではなく、ビンではない、または何を要求しているのかわからない
Marek Sebera '26

^(\ {){0,1} [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}(\}){0,1} $
ブランドンモレッツ

32の連続する16進数(チェーンなし)のチェーンを含む変数を除外できない場合、私の答えを
Wolf

回答:


413

現在、UUIDはRFC4122で指定されています。ここで指摘されている、しばしば無視されているエッジケースはNIL UUID です。次の正規表現はこれを考慮して、NIL UUIDの一致を返します。非NIL UUIDのみを受け入れるUUIDについては、以下を参照してください。これらのソリューションはどちらもバージョン1〜5に対応しています(3番目のブロックの最初の文字を参照)。

したがって、UUIDを検証するには...

/^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i

...バージョン1〜5であり、RFC4122に準拠した適切なバリアントである正規フォーマットのUUIDがあることを確認します。

注:中かっこは正規のもの{}はありません。これらは、一部のシステムと使用法の成果物です。

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

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

NIL 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
[1-5] [0-9a-f] {3}は間違っていると思います。その部分に「b06a」が含まれる有効なUUIDを持っていますが、これは失敗しました。
フェリペブラーム2014年

1
@FelipeBrahm、[1-5]はRFCによれば正しく、4ビットはバージョンを示し、バージョンは5つだけです。
rvignacio 2014年

749d0000-0194-1005-2e05-08d61613bf2fはフィドルに私のために失敗した
奪う

1
好奇心から、(なぜ)以下も有効ではないでしょう: [0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
tjeerdnet

58

救済への正規表現

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

3
かっこがある場合:/ ^ \ {?[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');
ryanb

これは正確ではありません。[1-5](バージョン)が3番目のブロックを開始し、[89AB](バリアント)が4番目のブロックを開始することはありません。ガンボルの答えはそれを正しく行います。
ウルフ、

7
より簡潔なバージョン(括弧は無視):/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
c24w

41

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

なお、唯一の違いは、バージョン番号に説明され、4.1.3. Versionの章UUID 4122 RFCは

バージョン番号は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

39

Node.jsを開発に使用している場合は、Validatorというパッケージを使用することをお勧めします。これには、UUIDのさまざまなバージョンを検証するために必要なすべての正規表現が含まれており、検証のために他のさまざまな機能を利用できます。

ここでは、NPMのリンクは次のとおりです。バリ

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

興味深いですが、ハイフンが必要なようですか?ここでは、現在使っている4つの正規表現である - /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i および/または /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i および/または /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i および/または /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i
ラフィン

1
ValidatorはUUID v3-5のみをサポートし、v1はサポートしません
peteb

13

横に戯れるの答え仕事をするほぼすべてのケースでは、与えられたすべての答えは、これまでにグループ化された書式設定(8-4-4-4-12が)に必須ではないことを逃したテキストでのエンコードのGUID。非常に頻繁に使用されますが、32桁の16進数のプレーンチェーンも有効である可能性があります。[1] 正規表現enh

/^[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]の質問は約あるチェックは INGの変数我々は、同様にユーザー非友好的な形を含める必要がありますので、秒。


これは私のお気に入りです。さらに良い{?[0-9a-f]{8}-?[0-9a-f]{4}-?[1-5][0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}}?
マイクネルソン2015

10

これまでに投稿されたすべてのタイプ固有の正規表現は、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」を適切に除外するには、次のようにします(Lukeに感謝)。

/^(?:[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

nil UUIDの最初のUUIDセグメントには、7ではなく8のゼロが必要です。提供された正規表現は、7では検証しませんでした
Rich Seviora

2
あなたの見栄えは良くなりますが、無効なUUIDを許可しabcdef00-0000-0000-0000-000000000000 ます。例:正規表現に一致します。この正規表現は、ゼロを含む有効なUUIDを、一致します:/^(?:[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
ルカ

10

いくつかの変更を加えた@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;
}

2

Gambolの答えはほぼ完璧だと思いますが、RFC 4122§4.1.1を誤って解釈しています。バリアントセクションが少しあります。

Variant-1 UUID(10xx = 8..b)は対象ですが、下位互換性のために予約されているVariant-0(0xxx = 0..7)とVariant-2(110x = c..d)のバリアントは対象外です。したがって、それらは技術的に有効なUUIDです。Variant-4(111x = e..f)は将来の使用のために予約されているため、現在は無効です。

また、0のタイプは無効です。その「数字」は、それがNIL UUIDである場合にのみ0にすることができます(Evanの回答で述べたように)。

現在のRFC 4122仕様に準拠している最も正確な正規表現は(ハイフンを含む)だと思います。

/^([0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[0-9a-d][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i
                            ^                ^^^^^^
                    (0 type is not valid)  (only e..f variant digit is invalid currently)

1

.match()メソッドを使用して、StringがUUIDかどうかを確認します。

public boolean isUUID(String s){
    return 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}$");
}

捕捉されなかったTypeError:s.matchesは関数ではありません
Deep Kakkar 2018年

1
指定されたスクリプトは、OPが要求したJavascriptではありません。
StefanJanssen

上記のコメントに対処するために回答を調整しました。ソリューションは期待どおりに機能するようになりました。
DeeZone

それはまだjsではありません。
ktilcu

1

より簡潔な方法で記述された、上記の回答を少し変更したバージョン。これにより、ハイフンでGUIDが検証されます(ただし、ハイフンをオプションにするために簡単に変更できます)。これは、仕様に関係なく規則となった大文字と小文字もサポートします。

/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i

ここで重要なのは、以下の繰り返し部分です

(([0-9a-fA-F]{4}\-){3})

これは単に4つの文字パターンを3回繰り返すだけです。


1
A-fでなければなりませんA-F。そうのように/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
DeeZone

ケース(/ i)を入れた場合、なぜafを繰り返し、次にAFを繰り返すのですか?
ニムロッド

0

Nodeでそれを行う良い方法は、ajvパッケージ(https://github.com/epoberezkin/ajv)を使用することです。

const Ajv = require('ajv');
const ajv = new Ajv({ allErrors: true, useDefault: true, verbose: true });
const uuidSchema = { type: 'string', format: 'uuid' };
ajv.validate(uuidSchema, 'bogus'); // returns false
ajv.validate(uuidSchema, 'd42a8273-a4fe-4eb2-b4ee-c1fc57eb9865'); // returns true with v4 GUID
ajv.validate(uuidSchema, '892717ce-3bd8-11ea-b77f-2e728ce88125'); // returns true with a v1 GUID

-1

私は、静的メソッド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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.