Welcome

首页 / 软件开发 / C++ / 集思广义支持中文的正则表达式库

集思广义支持中文的正则表达式库2010-06-12lanzhengpeng初衷——我想说的

大家好!

我所知道的正则表达式库有:boost的,GNU的,VC7带的ATL中的和微软发布的greta。我使用过后三种,greta使用时间最短(才两天)。

现在我来说说我的感受

GNU的正则表达式根本就不支持多字节码,设置连UNICODE都不支持,在parse阶段就会非法操作。在软件全球化的今天,实在不是一个好现象。优点是支持的语法完备。

ATL中的正则表达式不完全支持多字节码,可以完善的支持UNICODE。不过,此正则表达式书写非常清晰,没有用到STL里面任何高深的东西,也没有用到模板中特别高深的东西(我认为这才是C++的发展之道,毕竟,聪明人是少数——大部分是平庸的人,曲高寡合,总有一天会被大多数程序员抛弃,剩下一帮高手顾影自怜),所以,通过非常微小和容易的更改就可以完善支持多字节码。缺点是不支持{n,m}语法,不支持递归语法,如:"([^\"]*(\.)*[^\"]*)*"。最后一个*是不被支持的。

greta能完善的支持单字节码和UNICODE,语法也完善,而且据说普遍情况下速度也快,不过,把部分实现放cpp里导致不能同时使用单字节码和UNICODE编码,posix和perl语法,解决办法还算简单:把cpp改名为inl,在.h里include这个inl,再修改一点别的东西就可。问题是,它没有支持多字节码的实现,我仔细看看了,似乎通过自己写一个多字节码的迭代子,可以解决这个问题,因为他支持basic_string。

接下来的问题是:STL如何支持多字节码的?我没有在SGI-STL,STLPort453中找到关于多字节码的东西。basic_string默认只实现了char,wchar_t的base_string。而要自己实现一个迭代子,我又不知道如何下手。

我现在的需求是

需要正则表达式支持类似这样的语法:

“/汉字[ ]+[^ , ,]+[ ]*[,,][ ]*[^ , ,]+”

以匹配“/汉字 兰征鹏 ,正则表达式”。

使用STL进行字符串搜索都有问题,比如在一篇文章中搜索“正则”,很可能就把三个汉字的中间四个字节匹配上了。出现这样的情况,让人哭笑不得。

有这方面经验的或对STL比较熟悉的同仁,请勿吝啬指导

礼!

lanzhengpeng

2004-06-02

_______________________________________________

Cpp mailing list

在C/C++中如果想要使用与Perl兼容的regexp库,一个选择是Boost,另一个选择是PCRE库。Boost中的regex算法最近做了改近,平均效率比以前的版本提高了10倍,不过用起来可能比较麻烦。PCRE已经很成熟了,Apache/Postfix/PHP/Python都用它。我认为应该优先考虑。不过我自己没有在Windows下编译过,不是很有把握。

See www.pcre.org