2014-04-06 89 views
0

我試圖恢復倍數子串感謝boost :: regex,並把每一個變種。在這裏我的代碼:C++ boost :: regex倍數捕獲

unsigned int i = 0; 
std::string string = "--perspective=45.0,1.33,0.1,1000"; 
std::string::const_iterator start = string.begin(); 
std::string::const_iterator end = string.end(); 
std::vector<std::string> matches; 
boost::smatch what; 
boost::regex const ex(R"(^-?\d*\.?\d+),(^-?\d*\.?\d+),(^-?\d*\.?\d+),(^-?\d*\.?\d+))"); 

string.resize(4); 

while (boost::regex_search(start, end, what, ex) 
{ 
    std::string stest(what[1].first, what[1].second); 
    matches[i] = stest; 
    start = what[0].second; 
    ++i; 
} 

我想提取我的字符串的每個浮點並把它放在我的矢量變量匹配。目前,我的結果是,我可以提取第一個(在我的向量var中,我可以看到「45」沒有雙引號),但第二個在我的向量var中是空的(matches [1]是「」) 。

我找不出爲什麼以及如何解決這個問題。所以我的問題是如何糾正這個問題?我的正則表達式不正確嗎?我的比賽不正確?

回答

1
  1. 首先,^是一行的開始符號。其次,\必須逃脫。所以你應該修復每個(^-?\d*\.?\d+)組到(-?\\d*\\.\\d+)。 (可能(-?\\d+(?:\\.\\d+)?)更好。)

  2. 您的正則表達式搜索number,number,number,number模式,而不是每個數字。您只將第一個子字符串添加到matches並忽略其他字符。爲了解決這個問題,你可以用(-?\\d*\\.\\d+)取代你的表達或只是存儲在what的所有比賽添加到您的matches載體:

while (boost::regex_search(start, end, what, ex)) 
{ 
     for(int j = 1; j < what.size(); ++j) 
     { 
      std::string stest(what[j].first, what[j].second); 
      matches.push_back(stest); 
     } 
     start = what[0].second; 
} 
+0

我改變了我的正則表達式是:R「(^ - 透視=( - ?\ d * \ \ d +),( - ??\ d * \ \ d +),( - ??\ d * \ \ d +),( - ???\ d * \ \ d +) )「);但在你的解決方案中,我的第一個var包含第一個float的所有字符串。你知道爲什麼嗎 ? –

+0

@LaurentD。通過將parens添加到開頭和結尾,您將所有表達式分組。試試:'R'(?:^ - perspective =( - ?\ d * \。?\ d +),( - ?\ d * \。?\ d +),( - ?\ d * \。?\ d + ),( - ?\ d * \。?\ d +))「'或'R」^ - perspective =( - ?\ d * \。?\ d +),( - ?\ d * \。?\ d + ),( - ?\ d * \。?\ d +),( - ?\ d * \。?\ d +)「'代替。請記住,每個paren在正則表達式中都很重要。 :) – alphashooter

1

您在正則表達式中多次使用^。這就是爲什麼它不匹配。 ^表示字符串的開頭。在正則表達式的結尾還有一個額外的)。我不知道在那裏做什麼。

這裏是修正後的正則表達式:

(-?\d*\.?\d+),(-?\d*\.?\d+),(-?\d*\.?\d+),(-?\d*\.?\d+) 

一個更好版本的正則表達式即可(前提是你要避免匹配的號碼一樣.01.1):

(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?) 
0

重複搜索結合正則表達式,顯然是爲了匹配所有目標字符串而構建的,是毫無意義的。

如果您在由移動的迭代器和string.end()分隔的移動窗口中重複搜索,那麼您應該將模式減少爲匹配單個小數部分的模式。

如果您知道字符串中的分數數量必須是常量,則匹配一次,而不是循環,並從what中提取匹配的子字符串。