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

在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 )

 

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值