2016-07-22 49 views
0

我想用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

你真的真的需要这个正则表达式吗? –

+1

另外,如果你设置了'regex_constants :: escape_in_lists',你可以使用'\\ d'而不是'[0-9]'。 –

+0

也许正则表达式不是最好的解决方案;我想这是一个练习。我首先考虑的是正则表达式的原因是可以从配置中读取'regex'和'format'字符串。 – Svaberg

回答

0

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

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

这肯定是cuter,但仍有重复'(..)(..)(..)(..)(..)'我在想这样的事情' (....)(..){5}' – Svaberg

+0

也就是说仅用于数字'^([0-9] {4})([0-9] {2}){5}' – Svaberg

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