我正在使用正则表达式在文本块中搜索uuid。目前,我依赖于所有uuid都遵循8-4-4-4-12十六进制数字模式的假设。
有人能想到这样一个用例吗?在这个用例中,这个假设是无效的,并且会导致我错过一些uuid。
我正在使用正则表达式在文本块中搜索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/
其他回答
$UUID_RE = join '-', map { "[0-9a-f]{$_}" } 8, 4, 4, 4, 12;
顺便说一句,在一个位置上只允许4个只对UUIDv4有效。 但是v4并不是唯一存在的UUID版本。 我在实践中也遇到过v1。
所以,我认为Richard Bronosky给出了迄今为止最好的答案,但我认为你可以让它变得更简单(或至少更简洁):
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', re.I)
(\ 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}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}
如果你想强制整个字符串来匹配这个正则表达式,你有时(你的匹配器API可能有一个方法)需要用^…$,即
^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$
我同意根据定义,你的正则表达式不会遗漏任何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}}"