web-dev-qa-db-ja.com

文字列が有効なv4 UUIDであるかどうかを判断する方法は?

[〜#〜] uuid [〜#〜] に基づいてバリデーターを作成しています。これは、ユーザーが送信する特定のタイプのデータを識別するために使用します。クライアントが送信するUUIDが実際に有効な バージョン4UUIDであることを検証したいと考えています。

私はこれを見つけました PHP preg_match UUID v4 、それは近いですが、私が探しているものとはまったく異なります。 is_empty()またはstrtodate()に似たものが存在するかどうかを知りたい場合、文字列が有効でない場合はFALSEを送信します。

正規表現に基づいて行うこともできますが、よりネイティブなものをテストしたいと思います。

何か案は?

47
Rafael

バージョン4 UUIDの形式はxxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxここで、xは任意の16進数で、y89A、またはB

^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$

小文字を許可するには、i修飾子を使用します→

$UUIDv4 = '/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i';
preg_match($UUIDv4, $value) or die('Not valid UUID');
80
Ωmega

Python答え。同じ状況の人々を助けるために、Pythonソリューション。

uuid モジュールを使用できます:

#!/usr/bin/env python

from uuid import UUID


def is_valid_uuid(uuid_to_test, version=4):
    """
    Check if uuid_to_test is a valid UUID.

    Parameters
    ----------
    uuid_to_test : str
    version : {1, 2, 3, 4}

    Returns
    -------
    `True` if uuid_to_test is a valid UUID, otherwise `False`.

    Examples
    --------
    >>> is_valid_uuid('c9bf9e57-1685-4c89-bafb-ff5af830be8a')
    True
    >>> is_valid_uuid('c9bf9e58')
    False
    """
    try:
        uuid_obj = UUID(uuid_to_test, version=version)
    except ValueError:
        return False

    return str(uuid_obj) == uuid_to_test


if __== '__main__':
    import doctest
    doctest.testmod()
35
Martin Thoma
import re

UUID_PATTERN = re.compile(r'^[\da-f]{8}-([\da-f]{4}-){3}[\da-f]{12}$', re.IGNORECASE)
uuid = '20f5484b-88ae-49b0-8af0-3a389b4917dd'

if UUID_PATTERN.match(uuid):
    return True
else:
    return False
4
Andrey Shipilov

既存の回答はすべてregexを使用しています。Pythonを使用している場合は、try/except正規表現を使用したくない場合:(上記の回答よりも短いビット)。

検証ツールは次のようになります。

import uuid

def is_valid_uuid(val):
    try:
        uuid.UUID(str(val))
        return True
    except ValueError:
        return False

>>> is_valid_uuid(1)
False
>>> is_valid_uuid("123-UUID-wannabe")
False
>>> is_valid_uuid({"A":"b"})
False
>>> is_valid_uuid([1, 2, 3])
False
>>> is_valid_uuid(uuid.uuid4())
True
>>> is_valid_uuid(str(uuid.uuid4()))
True
>>> is_valid_uuid(uuid.uuid4().hex)
True
>>> is_valid_uuid(uuid.uuid3(uuid.NAMESPACE_DNS, 'example.net'))
True
>>> is_valid_uuid(uuid.uuid5(uuid.NAMESPACE_DNS, 'example.net'))
True
3
slajma

セキュリティのためだけに必要な場合(たとえば、JavaScriptコードで印刷する必要があり、XSSを避けたい場合)、実際にはダッシュの位置は重要ではないため、次のようになります。

 /^[a-z0-9\-]{36}$/i

https://regex101.com/r/MDqB2Z/1

3
the_nuts