2011-05-24 145 views
2

我想使用Boost的正則表達式庫將包含標籤和數字的字符串分隔爲標記。例如'abc1def002g30'將被分成{'abc','1','def','002','g','30'}。我修改Boost文檔中給出拿出此代碼example使用Boost-Regex將字符串解析爲字符和數字

#include <iostream> 
#include <boost/regex.hpp> 

using namespace std; 

int main(int argc,char **argv){ 
    string s,str; 
    int count; 
    do{ 
     count=0; 
     if(argc == 1) 
     { 
      cout << "Enter text to split (or \"quit\" to exit): "; 
      getline(cin, s); 
      if(s == "quit") break; 
     } 
     else 
      s = "This is a string of tokens"; 

     boost::regex re("[0-9]+|[a-z]+"); 
     boost::sregex_token_iterator i(s.begin(), s.end(), re, 0); 
     boost::sregex_token_iterator j; 
     while(i != j) 
     { 
      str=*i; 
      cout << str << endl; 
      count++; 
      i++; 
     } 
     cout << "There were " << count << " tokens found." << endl; 

    }while(argc == 1); 
    return 0; 
} 

存儲在count令牌的數量是正確的。但是,*it只包含一個空字符串,因此不會打印任何內容。任何猜測我做錯了什麼?

編輯:根據下面建議的修復,我修改了代碼,現在它工作正常。

回答

2

從上sregex_token_iterator文檔:

效果:構造一個regex_token_iterator將列舉一個字符串表達式的每個正則表達式匹配重新序列[中發現A,B),使用匹配標誌M(見match_flag_type)。枚舉的字符串是找到的每個匹配的子表達式子匹配; 如果子匹配是-1,然後枚舉與表達式不匹配的所有文本序列(即執行字段拆分)

由於您的正則表達式匹配所有項目(不像示例代碼,它只匹配字符串),你會得到空的結果。

嘗試用0代替它。

+0

謝謝,我應該更加關注那個submatch參數的作用。 – John 2011-05-24 20:15:46

+0

沒問題 - 請檢查它是否爲有效的答案,如果沒有,請在此處跟進。玩的開心! – holtavolt 2011-05-24 20:31:03