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

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


当前回答

如果使用POSIX正则表达式(grep -E, MySQL等),这可能更容易阅读和记忆:

[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}

Perl和PCRE版本也支持POSIX字符类,因此可以与它们一起工作。对于这些,将(…)更改为非捕获子组(?:…)。

JavaScript(以及其他支持Unicode属性的语法)可以使用类似的易读版本:

/\p{Hex_Digit}{8}(?:-\p{Hex_Digit}{4}){3}-\p{Hex_Digit}{12}/u

其他回答

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}

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

(\ w) {8} (-) (\ w) {4} {3} - [\ w]{12}在大多数情况下为我工作。

或者如果你想要真正特定[\ w] {8} - {4} (\ w) (\ w) {4} - {4} (\ w) (\ w){12}。

官方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

见参考

我同意根据定义,你的正则表达式不会遗漏任何UUID。然而,如果你特别搜索微软的全球唯一标识符(GUID),那么GUID有五个等效的字符串表示形式,这可能是有用的:

"ca761232ed4211cebacd00aa0057b223" 

"CA761232-ED42-11CE-BACD-00AA0057B223" 

"{CA761232-ED42-11CE-BACD-00AA0057B223}" 

"(CA761232-ED42-11CE-BACD-00AA0057B223)" 

"{0xCA761232, 0xED42, 0x11CE, {0xBA, 0xCD, 0x00, 0xAA, 0x00, 0x57, 0xB2, 0x23}}" 

对于在OS X上使用uuidgen生成的UUID,正则表达式模式为

[A-F0-9]{8}-[A-F0-9]{4}-4[A-F0-9]{3}-[89AB][A-F0-9]{3}-[A-F0-9]{12}

验证与

uuidgen | grep -E "[A-F0-9]{8}-[A-F0-9]{4}-4[A-F0-9]{3}-[89AB][A-F0-9]{3}-[A-F0-9]{12}"