2016-07-22 29 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