我需要格式化包含MAC地址的字符串(用于记录)。该字符串的格式为" xxxxxxxxxxxx"我需要将其标准化为" xx-xx-xx-xx-xx-xx"。什么是一个很好的正则表达式为此目的?
我正在使用GCC 4.4.7编译C ++代码。另外,我更喜欢使用boost regex。但是,如果有任何更简单的替代品,请告诉我。这就是我到目前为止所拥有的
std::string s = "e8f5a4b3e8e4";
boost::regex expr("^ *([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{2}) *$", boost::regex::extended | boost::regex::icase);
std::string fmt{"\\1-\\2-\\3-\\4-\\5-\\6"};
std::cout << boost::regex_replace(s, expr, fmt) << '\n';
我想知道我是否正在使用正则表达式的优化版本。
我试过这个正则表达式 - ^ *([[:xdigit:]]{2}){6} *$
在https://regex101.com,但它并没有捕获所有组。它只捕获最后一个。
答案 0 :(得分:0)
首先,这不是正确的答案,但我发布它可能会对您有所帮助。我不确定这是否适用于C ++,因为它适用于其他语言。
你可以试试这样的正则表达式:
(\w{2})
or
(.{2})
or
([[:xdigit:]]{2})
<强> Example demo 强>
并使用替换字符串\\1-
。例如,在javascript中你可以有这样的东西:
var re = /(\w{2})/g;
var result = 'e8f5a4b3e8e4'.replace(re, '$1-');
// result => e8-f5-a4-b3-e8-e4
这个想法是用相同的字符和连字符替换每两个字符。
同样,我不确定你是否在c ++中有类似的功能,但如果这样做,这个答案可以帮到你。如果没有,我可以删除。