Boost Regex用于格式化MAC地址字符串

时间:2015-05-06 01:28:48

标签: c++ regex boost-regex

我需要格式化包含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,但它并没有捕获所有组。它只捕获最后一个。

1 个答案:

答案 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 ++中有类似的功能,但如果这样做,这个答案可以帮到你。如果没有,我可以删除。