我正在使用正则表达式在文本块中搜索UUID.目前我依赖于所有UUID将遵循8-4-4-4-12十六进制数字的模式的假设.
任何人都可以想到一个用例,这个假设是无效的,会让我错过一些UUID吗?
Ive*_*lin 424
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
Run Code Online (Sandbox Code Playgroud)
Mat*_*ben 114
@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}
本来只是评论了这个,但没有足够的代表:)
Gaj*_*jus 103
版本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}/
Run Code Online (Sandbox Code Playgroud)
Iva*_*ele 80
如果要检查或验证特定的UUID版本,请使用以下相应的正则表达式.
请注意,唯一的区别是版本号,在UUID 4122 RFC的
4.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
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)Pan*_*nos 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}}"
Run Code Online (Sandbox Code Playgroud)
iGE*_*GEL 33
/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89AB][0-9a-f]{3}-[0-9a-f]{12}$/i
Run Code Online (Sandbox Code Playgroud)
Gajus的正则表达式拒绝UUID V1-3和5,即使它们是有效的.
Jim*_*imP 13
[\w]{8}(-[\w]{4}){3}-[\w]{12} 在大多数情况下,我一直在为我工作
或者如果你想要真正具体[\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12}.
Bru*_*sky 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']
Run Code Online (Sandbox Code Playgroud)
这使得最简单的Python UUID正则表达式:
re_uuid = re.compile("[0-F]{8}-([0-F]{4}-){3}[0-F]{12}", re.I)
Run Code Online (Sandbox Code Playgroud)
我将把它作为练习留给读者使用timeit来比较它们的性能.
请享用.保持它Pythonic™!
注意:这些跨度也将匹配:;<=>?@',如果您怀疑可能会给您误报,请不要使用快捷方式.(感谢Oliver Aubert在评论中指出这一点.)
根据定义,UUID是32个十六进制数字,按连字符分为5组,正如您所描述的那样.你的正则表达式不应该错过任何一个.
http://en.wikipedia.org/wiki/Uuid#Definition
如果使用 POSIX 正则表达式(grep -EMySQL 等),这可能更容易阅读和记住:
[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}\nRun Code Online (Sandbox Code Playgroud)\nPerl 和 PCRE 风格还支持 POSIX 字符类,因此可以与它们一起使用。对于这些,将 更改(\xe2\x80\xa6)为非捕获子组(?:\xe2\x80\xa6)。
JavaScript(以及其他支持 Unicode 属性的语法)可以使用类似的清晰版本:
\n[[:xdigit:]]{8}(-[[:xdigit:]]{4}){3}-[[:xdigit:]]{12}\nRun Code Online (Sandbox Code Playgroud)\n
所以,我认为Richard Bronosky实际上拥有迄今为止最好的答案,但我认为你可以做一些让它更简单(或者至少更简洁):
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', re.I)
Run Code Online (Sandbox Code Playgroud)
这是有效的 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}
Run Code Online (Sandbox Code Playgroud)
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];
Run Code Online (Sandbox Code Playgroud)
对于在OS X上使用生成的UUID uuidgen,正则表达式为
[A-F0-9]{8}-[A-F0-9]{4}-4[A-F0-9]{3}-[89AB][A-F0-9]{3}-[A-F0-9]{12}
Run Code Online (Sandbox Code Playgroud)
验证
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}"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
176652 次 |
| 最近记录: |