boost regex 正则表达式效率慢问题


我有这样一个正则表达式,希望匹配一段连接中的连接和连接文字,如:
<a href = "www.csdn.net" >csdn</a>
匹配www.csdn.net和csdn

正则表达式如下:
regex reg( "<a.+?href\\s*=\\s*\"{0,1}([^\"|\\s]*)\"{0,1}.*?>([^<]*)</a>" ,boost::regex::icase|boost::regex::perl);
smatch m;
我用的是
while ( regex_search( begin, end, m, reg ) )  //begin,end被匹配是字符串迭代器的开始和结束

if (m[1].matched) 

cout<<m[1].str()<<endl;

res += m[1].str();


begin = m[0].second;


这个正则表达式完全可以匹配我要求的结果,但问题是如果被匹配的字符串内容很大的话,几乎出现程序假死现象,请教达人予以指导。。

10 个解决方案

#1


第一,基本级使用,你应该使用regex_iterator,而不是自己这么search循环。
第二,regex的优化,你只有认真看看《Mastering Regular Expressions》,使用禁止回溯语法和减少不必要的*?+

#2


引用 1 楼 taodm 的回复:
第一,基本级使用,你应该使用regex_iterator,而不是自己这么search循环。 
第二,regex的优化,你只有认真看看《Mastering Regular Expressions》,使用禁止回溯语法和减少不必要的*?+

up

#3


up

#4


说实话,有些正则表达式库的实现有bug,在某些特别的case下奇慢无比。如果发现奇慢无比,换个等价但略有不同的正则表达式多试试吧。
另外你的字符串有多长?性能问题是出现在哪行代码上。

#5


up

#6


正则要性能还是用DFA引擎的吧, 虽然用起来不方便, 八过性能是刚刚地... NFA的总感觉不能信任...

#7


之前的被解析内容可能有点大,利用regex_iterator如何操作呢?请距离说一下,多谢了

#8


mLee79你的那套别人吃不消啊……

#9


Boost正则表达式好像要换为xpressive了,LZ不妨用它来试试

#10


引用 8 楼 iambic 的回复:
mLee79你的那套别人吃不消啊……


一开始是不习惯, 不过用两次以后就再也不想用一般的正则库了...
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告