我正在使用正则表达式在文本块中搜索uuid。目前,我依赖于所有uuid都遵循8-4-4-4-12十六进制数字模式的假设。
有人能想到这样一个用例吗?在这个用例中,这个假设是无效的,并且会导致我错过一些uuid。
我正在使用正则表达式在文本块中搜索uuid。目前,我依赖于所有uuid都遵循8-4-4-4-12十六进制数字模式的假设。
有人能想到这样一个用例吗?在这个用例中,这个假设是无效的,并且会导致我错过一些uuid。
当前回答
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}$
其他回答
所以,我认为Richard Bronosky给出了迄今为止最好的答案,但我认为你可以让它变得更简单(或至少更简洁):
re_uuid = re.compile(r'[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}', re.I)
概括一个例子,其中下划线也被适当地忽略,只允许字母数字值,模式为8-4-4-4-12。
^ (^ \ W_] {8} (- [^ \ W_] {4}) {4} [^ \ W_] {8} $
or
^ (^ \ W_] {8} (- [^ \ W_] {4}) {3} - [^ \ W_] {12} $
两者都给出相同的结果,但最后一个更易于阅读。我想推荐一个可以正确学习和测试正则表达式的网站:https://regexr.com/
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
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}$