集思广义支持中文的正则表达式库
副标题#e#
初志——我想说的
各人好!
我所知道的正则表达式库有: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
#p#副标题#e#
我小我私家很喜欢Ruby中的正则表达式成果,成果强,速度也很不错。因为Ruby是日本人发现的,处理惩罚东亚大字符集没有任何问题。Ruby与C/C++接口很容易,可是为了这个小成果插手Ruby,好像有点小题大做了。Perl我不熟悉。Lua独创了一套模式匹配语法,并且Lua天生就是要嵌入到C/C++中去的,机能比Perl/Ruby/Python都快的多。Lua的模式匹配语法有点怪,办理lanzhengpeng的问题仿佛是足够的,不外跟尺度regex语法完全差异。
我小我私家的感受,不如静下心来写一个iterator,应该是很容易的。不外我也好久没干过这种工作了,也就平常的说说算了。
孟岩
_______________________________________________
Cpp mailing list
发件人: kyo
发送时间: 2004年6月2日 11:19
收件人: ”C++ Discuss Group”
主题: RE: [cpp]正则表达式和多字节码的问题
兰兄的经验我很有履历,以前也曾经尽力寻找一套好用的正则表达式的C++库,然而用过今后都不太满足。正则表达式中公认的perl是做的最好的(此刻许多库都声称可以支持perl的正则表达式),好比懒惰匹配就很有用。
假如兰兄不是必需用C++ 做的话,可以用内嵌python引擎,然后用python里的正则表达式module re按你的要求的话,需要利用python 2.4以上版本,因为中文的unicode在2.4才支持(2.4还没有release。)
关于C++汉字查找的问题最近假话西游也碰着,因为要限制经济频道里的措辞必需包括“卖”。要准确判定的话,需要先把char*或string的字符串先用MultiByteToWideChar转为 WCHAR或wstring, 然后再查找。
但愿对你有用。
_______________________________________________
Cpp mailing list
孟岩,您好!
See www.pcre.org
多谢!
我小我私家的感受,不如静下心来写一个iterator,应该是很容易的。不外我也好久没干过这种工作了,也就平常的说说算了。
#p#分页标题#e#
我着手写了一下,好像我写一个iterator不起浸染,需要把base_string也一起写了。并且有个很大的问题:++操纵跟–操纵纷歧致。++的时候我可以很容易判定当前字节是否是多字节吗,从而地点+1照旧+2。可是,–的时候就不是那么好做了(思量到支持如GIB5——其汉字的后半字节编码跟英文有重叠),假如纯真的地点-1,会不会呈现问题,这个迭代子是否照旧random_iterator?
致
礼!
lanzhengpeng
2004-06-02
_______________________________________________
Cpp mailing list
发送时间: 2004年6月2日 15:53
收件人: C++ Discuss Group
主题: Re[2]: 复原: [cpp]正则表达式和多字节码的问题
Hello lanzhengpeng,
照旧转一下吧, 转成 wstring。
我想到别的一个问题, 也是我前段干过的。就是英文有 stricmp, 中文是否也应该有一个恍惚查找. 好比忽略掉同音字的。有时候也不消忽略所有同音字,高频字一般纵然同音也不会混用 。一些不常用到的字容易用同音别字取代。别的汉字有多音字的问题,使这种恍惚匹配的算法变得巨大。
我曾经花了一下午的时间整理资料,把大部门 GBK 字集里的汉字的汉语拼音都列出来的(包罗声调),包罗一字多音的。
尚有一种最常用的 1000 多字的按利用频率分列的表。
有没有人感乐趣呀