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

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


当前回答

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];

其他回答

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

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

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

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

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

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

or

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

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

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库使用以下正则表达式:

/^(?:[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

见参考