简单使用boost :: regex匹配组

时间:2016-07-22 12:30:11

标签: c++ boost boost-regex

我想使用boost::regex19991231235959格式的一堆日期格式更改为此格式1999-12-31_23:59:59,如下所示:

YYYYMMDDhhmmss --> YYYY-MM-DD_hh:mm:ss
19991231235959 --> 1999-12-31_23:59:59

我用这个

std::string input = "19991231235959";
boost::regex regex("^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})");
std::string format = "\\1-\\2-\\3_\\4:\\5:\\6";
std::string output = boost::regex_replace(input, regex, format);

哪有效但有没有办法摆脱([0-9]{2})构造中的重复regex并保留匹配组?

2 个答案:

答案 0 :(得分:0)

这取决于您的输入数据。如果您在每个输入行的开头有一个14位数的时间戳,则可以使用:

boost::regex regex("^(....)(..)(..)(..)(..)(..)");

答案 1 :(得分:0)

我正在做类似的事情。我喜欢做的一件事是命名我的捕获组。

boost::regex regex("\\D*(?<YYYY>\\d{4})\\D*(?<MM>\\d{2})\\D*(?<DD>\\d{2})\\D*(?<hh>\d{2})\\D*(?<mm>\\d{2})\\D*(?<ss>\\d{2})");

这为每个组提供了与格式字符串相同的名称。所以你可以做以下事情:

int year = lexical_cast<int>(what["YYYY"]);
int month = lexical_cast<int>(what["MM"]);

使用内置字符类也有帮助。上面的正则表达式将匹配这些输入中的每一个:

20160922015227
2016 09 22 01 52 27
2016_09_22-01:52:27