如何确定字符串是否为有效的 v4 UUID?

2022-08-30 07:15:13

我正在制作一个基于客户端浏览器生成的UUID的验证器,我用它来识别用户发送的某种类型的数据;并希望验证客户端发送的 确实是有效的版本 4UUIDUUID

我发现这个PHP preg_match UUID v4,它很接近,但并不完全是我想要的。我想知道是否存在类似于 或 如果字符串无效,则为“发送.is_empty()strtodate()FALSE

我可以基于正则表达式来做,但我想要一些更原生的东西来测试它。

有什么想法吗?

11/23/2019 编辑:关于重复标签,虽然主持人在技术上是正确的,但这个问题的制定目标是fibd其他东西来正则表达式(如果存在),其次,这个问题已经成为Pythoners和PHPers的参考,并且有不同的答案/方法来解决问题,他们的答案在一般情况下得到了更好的解释。这就是为什么我认为这个问题应该得到重视。


答案 1

版本 4 UUID 的格式为 任何十六进制数字,并且是 、 、 或 之一。xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxxy89AB

^[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');

答案 2

我在寻找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 __name__ == '__main__':
    import doctest
    doctest.testmod()

推荐