2013-10-23 28 views
0

所以,我有一個示例文件,我試圖在一行中讀取它。基於該行的第一個詞,我想確定如何處理其餘部分。regex_split()VC++ 11中的等價性僅使用標準庫

baa made up text 
squeak 954823 
moo 0 321 123 45543 
. ^
. more moo lines here, fixed in length 
.  v 
squeak x 
woof 8 
oink 1 2 3 4 5 6 7 98 93 12 23 43 
.  
. more oink lines here, m in quantity, differing in length 
. 
woof x 
baa x 
//more text here 

我只在這時使用。我有幾個正則表達式旨在處理這些格式的行。我正在整理的問題是如何以正確的順序正確訪問子組匹配。我發現的所有材料都是指GCC作爲編譯器,而且我正在經歷與vC++編譯器不同的行爲。我使用Visual Studio 2010中

我想驗證每個線對是一個匹配:

^(baa|squeak|moo|woof|oink)\s(.*) 

這是語法,我寫/內置快報,這似乎並不相當什麼VC++正則表達式正在尋找。現在,我將假定它是正確的 - 它確實描述了我想要的兩個子羣。然後,我們假設我們正在查看上面的第一行示例,並且已經驗證了第一個子組匹配'baa',我想檢查:是第二個子組只是一個'x'還是由它組成更多?如果它包含更多我要執行一個函數A(),否則我會執行一個函數B()。

然後,根據第一個子組匹配的詞,我想用不同的正則表達式處理第二個子組,進一步切割子組的不同部分。不幸的是,它似乎並不是完全線性的遍歷整個匹配。

在我的閱讀中,我遇到了一個名爲regex_split()的boost :: regex函數,它似乎在做我在找的東西,但它已經被棄用了。

我在看boost :: tokenizer的功能,雖然我可以讓它做我想做的事情,但正則表達式方法應該更清晰。

所以,我的問題,在單行:

什麼是爲了我」分裂分組使用在Visual Studio 2010中的Visual C++的regex_iterator()函數,而Boost庫正確的代碼已經描述過?

是否有任何方式使用標準正則表達式庫命名的子組(Perl)?

回答

0

鑑於正在處理的正則表達式的瑣碎性,我會說正確的方法是不打擾這個工作的正則表達式。我只是這樣做:

std::set permitted{"baa", "squeak", "moo", "woof", "oink"}; 

std::string head, tail; 

while (infile >> head) 
    if (permitted.find(head) == permitted.end()) 
     bad_input(head); 
    else 
     std::getline(infile, tail); 

根據不同的情況,您可能需要使用std::map而不是std::set的。這將讓你存儲正則表達式(可能還有一些代碼的引用)來匹配和處理該行的其餘部分。

+0

謝謝,這有助於一些。因此,現在我可以根據那些標識應該讀取上下文敏感行的方式的最初單詞來識別第一個單詞。但是我仍然需要regex_ ()調用的幫助來將下一行分解爲它們的片斷,或者當我需要處理迄今爲止閱讀的數據時。任何建議,將不勝感激! –

相關問題