2013-02-02 83 views
5

我已經查看了C++ 11新的正則表達式庫的一些源代碼,但其中大多數更注重語法,或者像regex_match這樣的更基本的用法,或regex_search。雖然這些文章幫助我開始使用正則表達式庫,但我很難在捕獲組中找到更多詳細信息。C++ 11正則表達式查找捕獲組標識符

我想要完成的是找出匹配屬於哪個捕獲組。到目前爲止,我只找到一種方法來做到這一點。

#include <iostream> 
#include <string> 
#include <regex> 

int main(int argc, char** argv) 
{ 
    std::string input = "+12 -12 -13 90 qwerty"; 
    std::regex pattern("([+-]?[[:digit:]]+)|([[:alpha:]]+)"); 

    auto iter_begin = std::sregex_token_iterator(input.begin(), input.end(), pattern, 1); 
    auto iter_end = std::sregex_token_iterator(); 

    for (auto it = iter_begin; it != iter_end; ++it) 
    { 
     std::ssub_match match = *it; 
     std::cout << "Match: " << match.str() << " [" << match.length() << "]" << std::endl; 
    } 

    std::cout << std::endl << "Done matching..." << std::endl; 
    std::string temp; 
    std::getline(std::cin, temp); 

    return 0; 
} 

在改變std::sregex_token_iterator第四個參數的值,我可以控制哪些子匹配它會繼續,告訴它扔掉他們的休息。因此,要找出一個匹配屬於哪個捕獲組,我可以簡單地遍歷捕獲組來找出哪些匹配不會被丟棄用於特定組。

然而,這將是不可取的我,因爲除非有一些緩存在後臺事情我期望的std::sregex_token_iterator每個施工再次越過輸入,並找到匹配(有人請糾正我,如果這是錯了,但這是我可以得出的最好結論)。

有沒有更好的方法找到匹配所屬的捕獲組?或者正在迭代子匹配的最佳行動方案?

回答

5

改爲使用regex_iterator。對於每場比賽,您將有權訪問match_results,其中包含所有sub_match es,您可以在此查看匹配所屬的哪個捕獲組。

+0

非常感謝,這正是我希望的。 – TheCodeBroski