我有这样一个正则表达式,希望匹配一段连接中的连接和连接文字,如:
<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 个解决方案
第一,基本级使用,你应该使用regex_iterator,而不是自己这么search循环。
第二,regex的优化,你只有认真看看《Mastering Regular Expressions》,使用禁止回溯语法和减少不必要的*?+
说实话,有些正则表达式库的实现有bug,在某些特别的case下奇慢无比。如果发现奇慢无比,换个等价但略有不同的正则表达式多试试吧。
另外你的字符串有多长?性能问题是出现在哪行代码上。
正则要性能还是用DFA引擎的吧, 虽然用起来不方便, 八过性能是刚刚地... NFA的总感觉不能信任...
之前的被解析内容可能有点大,利用regex_iterator如何操作呢?请距离说一下,多谢了
Boost正则表达式好像要换为xpressive了,LZ不妨用它来试试