2015-10-15 116 views
2
bool validateCurrencyLine(string line){ 
    cout << "TESTING LINE : " << line << endl; 
    string pattern = "[ ]*([A-Z]{3}) ([0-9]+)([ ]*|,[0-9]+[ ]*)"; 
    boost::regex expr{pattern}; 
    return boost::regex_match(line,expr); 
} 

int main() 
{ 
    string line; 
    while(getline(cin,line)){ 
     cout << validateCurrencyLine(line) << endl; 
    } 
    return 0; 
} 

test文件的內容如下:不同結果

IDK 3453443

現在,當我使用./a.out < test結果是啓動程序

TESTING LINE : IDK 3453443 
0 
TESTING LINE : 
0 

我的假設是,第二條線是印刷,因爲testfile的第一行實際上是

IDK 3453443 +進入

我是正確)

但真正的問題是,當我象這樣開始:./a.out並輸入「IDK 3453443」,然後按回車。結果是:

TESTING LINE : IDK 3453443 
1 

這兩個結果有什麼不同?

+0

你確定在文件中的\ n之前沒有'\ r'嗎?這可能是罪魁禍首...嘗試'string pattern =「[] *([AZ] {3})([0-9] +)([] * |,[0-9] + \\ s *) 「'。或'regex_search'而不是'regex_match'。 –

+0

不幸的是,新模式仍然沒有工作@stribizhev – user3142434

回答

0

事實上,行結束是罪魁禍首。

在十六進制編輯器中查看文件,您會發現0d 0a行結束符(Windows或CRLF),其中代碼需要UNIX行結束符(僅LF)。

親身體驗:

Live On Coliru

你可以解決它通過 '吃' 的所有空格結尾:

Live On Coliru

std::string pattern = "[ ]*([A-Z]{3}) ([0-9]+)(,[0-9]+)?\\s*"; 

現在都被接受了。