非常规情况下的正则无法匹配问题

在C/C++中没有专门的正则库,所有只好使用第三方库,我首先选择的是boost的regex。虽说boost的regex类比较复杂,但在这之前我也用过,没出过问题。但这次却因一个小小的疏忽折腾了我两天。

程序的功能是从文件中读取字符串,接着从数据库读取正则表达式,却发现有几个正则表达式无法匹配,但用这些正则表达式到正则测试工具中又能够匹配。

首先我怀疑boost的中文匹配功能,所以将读取的字符串转换为了宽字符,但仍然无法匹配。接着我怀疑是我使用boost的方法不对,因为在用boost进行简单测试时,又百分百能够匹配。在boost的问题上折腾了一天,仍然找不到原因。

于是下了个deelx,这个正则库只有一个头文件,比较小巧,先作了个简单的测试,没出现问题,但用到程序中时,出现了同样的问题,还是无法匹配。

这时头大了,由于需要匹配的字符串是由文件中读取,而读取文件的函数是我自己写的,用的是CFile。我又怀疑是我读取文件的方法不对,接着修改文件读取函数,用C语言的文件读取函数来进行读取,可问题依旧。

就这样折腾了两天,最后还得感谢deelx作者写的一个正则测试工具,这个工具可以生成C++代码。通过查看这个工具生成的C++代码,才慢慢理出了头绪。

原因在于出错的那个正则表达式有回车换行这样的特殊字符,而我写的读取文件的函数是以ANSI方式读取的:

if ( fopen_s( &file, W2A( FilePath ), "r" ) != 0 )

用ANSI方式读取文件,会无法读取文件中的回车符号( \r ),最后用二进制方式读取文件就解决了:

if ( fopen_s( &file, W2A( FilePath ), "rb" ) != 0 )

哎。。。。就差这么一个字符,就耗了我两天。

posted @ 2009-07-09 20:59  冷寒生  阅读(237)  评论(0编辑  收藏  举报
IT知识库