2017-09-16 116 views
-1

我試圖分析在C++中使用正則表達式的文件的字符串,但是當我從文件中讀取字符串,regex_search不工作:C++ 11 regex_search不工作,但regex_match是

string stream; 

    ifstream file("weather.txt"); 
    stream.assign((istreambuf_iterator<char>(file)), 
       (istreambuf_iterator<char>())); 

    const string s = stream; 
    regex rgx("[0-9]{1,2}-[0-9]{1,2}"); 
    smatch match; 

    for(i=0; i < 12; i++){ 
    if (regex_search(s, match, rgx)) 
     cout << "match: " << match[i] << '\n'; 
    } 

但是,如果我做了regex_match(),它的工作原理:

if (regex_match(s, rgx)); 
    cout <<" YEass"; 

我試圖用一個簡單的字符串和它的工作,但是當我從文件中讀取內容它不工作。

回答

0

當您使用regex_search和你期望獲得超過1結果
你必須使用迭代器(指針),進入到下一個起始位置
字符串中。

std::string::const_iterator start, end; 
start = s.begin(); 
end = s.end(); 
smatch m; 

while (regex_search(start, end, m, rx)) 
{ 
    // do something with the results 
    std::string sgrp1(m[1].first, m[1].second); 
    std::string sgrp2(m[2].first, m[2].second); 
    std::string sgrp3(m[3].first, m[3].second); 
    // etc, ... 

    // update search position: 
    start = m[0].second; 
} 

什麼你實際上做的是試圖
12次,以顯示個人12組一次一個重新匹配整個字符串,
這是沒有辦法的辦法去。

如果您確實有12組,則只需匹配一次,然後在匹配結果上迭代

if (regex_search(start, end, m, rx)) 
{ 
    for (int i = 0; i < 12; i++) 
    { 
     std::string str(m[i].first, m[i].second); 
     cout << "group " << i << " = " << str << "\r\n"; 
    } 
} 
+0

感謝您的回答,我還無法測試它,但我不太瞭解第一個示例中的字符串組。每個字符串組都是來自搜索的匹配項? m的第一個和第二個對象究竟是什麼?對不起,這是我第一次使用這個正則表達式庫,我還不熟悉它。 –

+0

我嘗試了兩個選項,但regex_search仍然返回錯誤:( –

+0

_'match_results'_是子表達式匹配的索引集合。_'sub_match'_類型的對象只能通過對類型爲match_results的對象進行下標獲取。每個sub_match代表一個在正則表達式中定義的_group_,比如'(abc)(def)(ghi)(jk)'有4個組,但是你的正則表達式是[0-9] {1,2 } - [0-9] {1,2}'沒有組,事實上,當你嘗試在你的循環中通過'm [i]'來索引匹配對象時,它會引發一個運行時錯誤。 – sln