2014-01-09 37 views
0

我對如何在std :: tr1 :: regex中運行regex_search函數後獲取結果感到困惑。 以下是演示我的問題的示例代碼。檢索std :: tr1 :: regex_search的結果

string source = "abcd 16000 "; 
string exp = "abcd ([^\\s]+)"; 
std::tr1::cmatch res; 
std::tr1::regex rx(exp); 

while(std::tr1::regex_search(source.c_str(), res, rx, std::tr1::regex_constants::match_continuous)) 
{ 

    //HOW TO FETCH THE RESULT??????????? 
    std::cout <<" "<< res.str()<<endl; 

    source = res.suffix().str(); 
} 

提到應該理想地剝離字符串中的「ABCD」,回到了我16000

我看到C匹配資源有兩個對象的正則表達式。第二個對象包含預期結果(該對象有三個成員(匹配的,第一個,第二個),值爲{true,「16000」,「」}}。對象表示爲什麼當我只運行一次regex_search時,爲什麼在這個特定情況下顯示2(res [0]和res [1])?我如何知道哪個對象會有預期的結果?

謝謝 蘇尼爾

回答

0

如前所述here

墊CH [0]:表示整個匹配
匹配[1]:表示第一匹配
匹配[2]:表示的第二場比賽,等等

這意味着match[0]應該 - 在這種情況下! - 保留完整的sourceabcd 16000),因爲您匹配整個事物,而match[1]包含您的capturing group的內容。
例如,如果在您的正則表達式中有第二個捕獲組,您將在匹配集合中獲得第三個對象,依此類推。

我是誰理解可視化的問題/解決方案,更好的一個傢伙,讓我們做到這一點:
[email protected]

enter image description here

查看在含有將TestString文本字段的兩種顏色?
綠色是您捕獲組的背景,而
藍色代表一切一般由表達式匹配,而不是由任何組捕獲。
換句話說:在你的情況下,藍+綠相當於match[0]和綠色的match[1]

這樣,您就可以隨時知道該物體在match指捕獲組:
你在你的腦袋初始化一個計數器,從0開始。現在,通過正則表達式去從左邊到右邊,加1對於每個(,併爲每個)減1,直到到達要提取的捕獲組的開頭括號。你頭上的數字是數組索引。

編輯
關於對檢查res[0].first您的評論:

成員的sub_match類的first只有

表示在比賽開始的位置。

second表示比賽結束的位置。
(從boost doc截取)
兩種方法都返回一個char*(VC++ 10)或iterator(升壓),從而你得到sourcestring的子串作爲輸出(其可以是在殼體的完整源匹配開始於索引零!)。

考慮下面的程序(VC++ 10):

#include "stdafx.h" 
#include <regex> 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    string source = "abcdababcdefg"; 
    string exp = "ab"; 
    tr1::cmatch res; 
    tr1::regex rx(exp); 

    tr1::regex_search(source.c_str(), res, rx); 

    for (size_t n = 0; n < res.size(); ++n) 
    { 
     std::cout << "submatch[" << n << "]: matched == " << std::boolalpha 
      << res[n].matched << 
      " at position " << res.position(n) << std::endl; 
     std::cout << " " << res.length(n) 
      << " chars, value == " << res[n] << std::endl; 
    } 
    std::cout << std::endl; 

    cout << "res[0].first: " << res[0].first << " - res[0].second: " << res[0].second << std::endl; 
    cout << "res[0]: " << res[0]; 

    cin.get(); 

    return 0; 
} 

執行它,並期待在輸出。第一個(也是唯一的)匹配是 - 顯然 - 第一個字符爲ab,所以這實際上是整個匹配字符串以及爲什麼res[0] == "ab"
現在,知道.first/.second從比賽開始就給我們子串,並且從比賽結束開始,輸出不應該再混淆了。

+0

考慮一下。源=「abcdabcdabcd」和exp =「ab」。該工具突出顯示藍色的ab。但是,當我使用正則表達式執行此代碼時,結果大小爲1,而res [0] .first爲「abcdabcdabcd」。我相信「abcdabcdabcd」的reg exp「ab」應該返回「ab」。這裏有什麼問題? –

+0

錯在這裏是你調用'res [0] .first'。檢查'res [0]'的內容:它是'ab'! –

+0

@SunilRaj編輯了我的答案並添加了更多信息 –

相關問題