使用正则表达式在文本中搜索UUID

时间:2008-09-25 22:08:27

标签: regex

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

任何人都可以想到这个假设无效且会导致我错过一些UUID的用例吗?

17 个答案:

答案 0 :(得分:402)

uuid的正则表达式是:

\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b

答案 1 :(得分:111)

@ivelin:UUID可以有大写字母。因此,您需要使用toLowerCase()字符串或使用:

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

本来只是评论了这个,但没有足够的代表:)

答案 2 :(得分:98)

  

版本4 UUID的格式为xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,其中x是任何十六进制数字,y是8,9,A或B之一。 f47ac10b-58cc-4372-a567-0e02b2c3d479。

来源:http://en.wikipedia.org/wiki/Uuid#Definition

因此,这在技术上更正确:

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

答案 3 :(得分:69)

如果您想检查或验证特定的UUID版本,以下是相应的正则表达式。

  

请注意唯一的区别是版本号UUID 4122 RFC4.1.3. Version一章对此进行了解释。

版本号是第三组的第一个字符:[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
    

答案 4 :(得分:37)

我同意根据定义你的正则表达式不会遗漏任何UUID。但是,请注意,如果您特别针对Microsoft的全局唯一标识符(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}}" 

答案 5 :(得分:32)

/^[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,即使它们有效。

答案 6 :(得分:14)

在大多数情况下,

[\w]{8}(-[\w]{4}){3}-[\w]{12}对我有用。

或者,如果你想真正具体[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}

答案 7 :(得分:10)

在python中,你可以从数字到大写的alpha。所以..

import re
test = "01234ABCDEFGHIJKabcdefghijk01234abcdefghijkABCDEFGHIJK"
re.compile(r'[0-f]+').findall(test) # Bad: matches all uppercase alpha chars
## ['01234ABCDEFGHIJKabcdef', '01234abcdef', 'ABCDEFGHIJK']
re.compile(r'[0-F]+').findall(test) # Partial: does not match lowercase hex chars
## ['01234ABCDEF', '01234', 'ABCDEF']
re.compile(r'[0-F]+', re.I).findall(test) # Good
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-f]+', re.I).findall(test) # Good
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-Fa-f]+').findall(test) # Good (with uppercase-only magic)
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']
re.compile(r'[0-9a-fA-F]+').findall(test) # Good (with no magic)
## ['01234ABCDEF', 'abcdef', '01234abcdef', 'ABCDEF']

这是最简单的Python UUID正则表达式:

re_uuid = re.compile("[0-F]{8}-([0-F]{4}-){3}[0-F]{12}", re.I)

我会把它作为练习留给读者使用timeit来比较这些的表现。

享受。 保持Pythonic™!

注意:这些范围也会与:;<=>?@'匹配,因此,如果您怀疑可能会误报,请不要使用快捷方式。 (感谢Oliver Aubert在评论中指出这一点。)

答案 8 :(得分:10)

根据定义,UUID是32个十六进制数字,用连字符分隔5组,正如您所描述的那样。你不应该错过正则表达式。

http://en.wikipedia.org/wiki/Uuid#Definition

答案 9 :(得分:6)

所以,我认为Richard Bronosky实际上拥有迄今为止最好的答案,但我认为你可以做一些让它更简单(或者至少更简洁):

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

答案 10 :(得分:5)

C ++的变体:

#include <regex>  // Required include

...

// Source string    
std::wstring srcStr = L"String with GIUD: {4d36e96e-e325-11ce-bfc1-08002be10318} any text";

// Regex and match
std::wsmatch match;
std::wregex rx(L"(\\{[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}\\})", std::regex_constants::icase);

// Search
std::regex_search(srcStr, match, rx);

// Result
std::wstring strGUID       = match[1];

答案 11 :(得分:5)

对于在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}"

答案 12 :(得分:2)

$UUID_RE = join '-', map { "[0-9a-f]{$_}" } 8, 4, 4, 4, 12;
BTW,只允许其中一个位置上的4个仅对UUIDv4有效。 但是v4并不是唯一存在的UUID版本。 我也在练习中遇到了v1。

答案 13 :(得分:2)

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

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

编辑: Perl和PCRE样式还支持Posix字符类,因此可以与它们一起使用。对于这些,将(…)更改为非捕获子组(?:…)

答案 14 :(得分:1)

以下是有效的正则表达式: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}

答案 15 :(得分:0)

对于bash:

grep -E "[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}"

例如:

$> echo "f2575e6a-9bce-49e7-ae7c-bff6b555bda4" | grep -E "[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}"
f2575e6a-9bce-49e7-ae7c-bff6b555bda4

答案 16 :(得分:0)

希望提供我的贡献,因为我的正则表达式涵盖了OP中的所有情况,并在group方法上正确地将所有相关数据分组(您无需对字符串进行后期处理即可获取uuid的每个部分,因此该正则表达式已获得给你的东西

([\d\w]{8})-?([\d\w]{4})-?([\d\w]{4})-?([\d\w]{4})-?([\d\w]{12})|[{0x]*([\d\w]{8})[0x, ]{4}([\d\w]{4})[0x, ]{4}([\d\w]{4})[0x, {]{5}([\d\w]{2})[0x, ]{4}([\d\w]{2})[0x, ]{4}([\d\w]{2})[0x, ]{4}([\d\w]{2})[0x, ]{4}([\d\w]{2})[0x, ]{4}([\d\w]{2})[0x, ]{4}([\d\w]{2})[0x, ]{4}([\d\w]{2})