我想使用boost::regex
将19991231235959
格式的一堆日期格式更改为此格式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
并保留匹配组?
答案 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