我正在使用正则表达式在文本块中搜索uuid。目前,我依赖于所有uuid都遵循8-4-4-4-12十六进制数字模式的假设。

有人能想到这样一个用例吗?在这个用例中,这个假设是无效的,并且会导致我错过一些uuid。


当前回答

概括一个例子,其中下划线也被适当地忽略,只允许字母数字值,模式为8-4-4-4-12。

^ (^ \ W_] {8} (- [^ \ W_] {4}) {4} [^ \ W_] {8} $

or

^ (^ \ W_] {8} (- [^ \ W_] {4}) {3} - [^ \ W_] {12} $

两者都给出相同的结果,但最后一个更易于阅读。我想推荐一个可以正确学习和测试正则表达式的网站:https://regexr.com/

其他回答

下面是工作的REGEX: https://www.regextester.com/99148

const regex = [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}-[1-5][0-9a-f]{3}-[89AB][0-9a-f]{3}-[0-9a-f]{12}$/i

Gajus的regexp拒绝UUID V1-3和5,尽管它们是有效的。

所以,我认为Richard Bronosky给出了迄今为止最好的答案,但我认为你可以让它变得更简单(或至少更简洁):

re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', re.I)

UUID可以有大写字母。所以你需要toLowerCase()字符串或使用:

[a-fA-F0-9] {8} - {4} [a-fA-F0-9] [a-fA-F0-9] {4} - {4} [a-fA-F0-9] [a-fA-F0-9] {12}

本想评论一下,但没有足够的代表:)

版本4的uuid形式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,其中x是任何十六进制数字,y是8,9,A或b中的一个,例如f47ac10b-58cc-4372-a567-0e02b2c3d479。

来源:http://en.wikipedia.org/wiki/Uuid定义

因此,从技术上讲,这是更正确的:

/[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}/