2015-10-15 118 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*"; 

现在都被接受了。