変数に有効なUUID / GUID識別子が含まれているかどうかを確認するにはどうすればよいですか?
私は現在、タイプ1と4の検証のみに関心がありますが、それはあなたの回答に対する制限ではありません。
変数に有効なUUID / GUID識別子が含まれているかどうかを確認するにはどうすればよいですか?
私は現在、タイプ1と4の検証のみに関心がありますが、それはあなたの回答に対する制限ではありません。
回答:
現在、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
[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
救済への正規表現
/^[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}\}?$/
/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/i
特定の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
Node.jsを開発に使用している場合は、Validatorというパッケージを使用することをお勧めします。これには、UUIDのさまざまなバージョンを検証するために必要なすべての正規表現が含まれており、検証のために他のさまざまな機能を利用できます。
ここでは、NPMのリンクは次のとおりです。バリ
var a = 'd3aa88e2-c754-41e0-8ba6-4198a34aa0a2'
v.isUUID(a)
true
v.isUUID('abc')
false
v.isNull(a)
false
/^[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
横に戯れるの答え仕事をするほぼすべてのケースでは、与えられたすべての答えは、これまでにグループ化された書式設定(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}}?
これまでに投稿されたすべてのタイプ固有の正規表現は、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
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
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)
.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}$");
}
より簡潔な方法で記述された、上記の回答を少し変更したバージョン。これにより、ハイフンで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回繰り返すだけです。
A-f
でなければなりませんA-F
。そうのように/^([0-9a-fA-F]{8})-(([0-9a-fA-F]{4}\-){3})([0-9a-fA-F]{12})$/i
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
私は、静的メソッド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