2014-03-13 106 views
0
ifstream infile("somefile.txt"); 
    char letter; 
    infile >> noskipws >> letter; 
    string word; 
    word = letter; 
    while(regex_match(word, regex("[A-Za-z_][A-Za-z0-9_]*", regex_constants::basic))){ 
     infile >> letter; 
     word += letter; 
    } 
    if(regex_match(word, regex("[A-Za-z_][A-Za-z0-9_]*.", regex_constants::basic))){ 
     //Do stuff 
    } 

當我運行這段代碼和GDB看它正則表達式驅動,while循環將是infile是餵養letter在文本文件中執行恰好一次,無論是文字。然後,它會跳過if語句,因爲if語句顯然返回false。此功能的每次運行都應該有word將整個單詞保存在infile的當前位置。我的正則表達式失敗了?或者是別的什麼?while循環不循環正常

舉例說明:僅包含單詞「文字失敗」的文本文件將在函數結尾處包含「wo」。

+0

我真的不明白你想要做什麼,但在有些觀點需要消耗空間,否則'while'循環將匹配第一個單詞,然後停止匹配,因爲下一部分以空格(或標點符號或非[A-Za-z_])開頭。並且在'if'中的示例代碼中,有一個變量'recognised',它在任何地方都沒有聲明... –

+0

@ mathematical.coffee這正是循環應該如何操作的。相反,「單詞」一次不會超過2個字符,它們將是任何字符。 – MowDownJoe

回答

0

從升壓文檔的:

'The algorithm regex_match determines whether a given regular expression matches 
all of a given character sequence' 

如果您的初始word不匹配,它永遠不會被追加到。
因此,無論是同時和如果失敗。

+0

以示例更新問題。我知道這些代碼行應該如何工作。問題是,爲什麼他們的行爲方式實際上是這樣。 – MowDownJoe

+0

@MowDownJoe - 使用'regex_constants :: perl'試試它,並在regex_match語句之前驗證'word'變量的內容。 – sln

+0

我應該澄清,我沒有使用Boost正則表達式,而是使用-std = C++ 0x編譯的std :: regex。另外,在第一次regex_match之前,單詞只有文件中的第一個字符。 – MowDownJoe

1

@MowDownJoe - 我相信std::regexboost::regex,但你爲什麼玩耍,分配一個常數和測試regex_match()。如果它工作的很好,如果不行,regex在編譯的Lang中不起作用。

+0

當您發佈答案時,您不必通過使用'@'標記用戶詢問問題。當他/她的問題的回答發佈時,用戶將以任何方式得到通知。 – rockinfresh

+0

你不能說std :: regex是boost :: regex。如果你使用std :: regex,你得到你的編譯器供應商的std :: regex的*實現,而不是boost。同樣std :: regex在boost :: regex之後被建模,雖然有一些差異。 – harmic

1

我認爲你看到的是std :: regex的錯誤執行的結果。我想一個更簡單的使用相同的正則表達式(見http://ideone.com/xuY2nD):

#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 

    string s = "He"; 
    if (regex_match(s, regex("[A-Za-z_][A-Za-z0-9_]*", regex_constants::basic))) { 
     cout << "Match" << endl; 
    } 

    return 0; 
} 

,並沒有匹配 - 這是應該做的。然後,我嘗試了同樣的事情,但使用boost :: regex,它按預期工作。

從什麼我read gcc版本< 4.9沒有工作std :: regex的支持。

幾面指針:

  • 構建正則表達式實例可以是昂貴的 - 你不應該這樣做在一個循環中,你已經做了。事實上,如果函數在程序中被多次調用並且正則表達式是常量,那麼最好聲明一個靜態常量實例

  • 在任何情況下,如果您只是檢查你添加到你的'單詞'的字符,而不是重新匹配整個單詞。您知道您添加的字符到目前爲止已經匹配,因此不需要重新匹配整個字符串。

  • 第二個正則表達式匹配也似乎是多餘的 - 如果在循環中的第一個工作,然後第二個必須匹配