boost regex 的regex_match 不能处理冗长数据

leeeryan 2010-10-27 03:41:21
没当我的字符串数据 大于1000多行时 就会给我扔一个这样的异常:
if(state_count > max_state_count)
raise_error(traits_inst, regex_constants::error_complexity);
字面上看,好像是说数据太复杂了!
有没有人遇到过这种情况?
...全文
402 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mLee79 2010-10-27
  • 打赏
  • 举报
回复
看来 boost 比我想象的要弱些... 偶不会 boost , 不过原理应该差不多, 你比较下...

$ printf "\n%%%%\n.+document\.createElement\(.*\).+\n" | flex -F -o 1.x
$ printf "\n%%%%\ndocument\.createElement\(.*\)\n" | flex -F -o 2.x

就知道二者差了多少....
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 mlee79 的回复:]

你首尾 .+ 是打算弄来干嘛的, 为虾米不匹配了再检查下, 小测试了下, 你的 正则生成的状态数是 10K 左右, 去掉 .+ 状态数是 900 左右... 正则里的 .* .+ 绝对不是好玩的玩意儿...
[/Quote]

你那个正则生成状态数怎么看的?我去掉.+了,改用regex_search 依然是这个问题!
mLee79 2010-10-27
  • 打赏
  • 举报
回复
你首尾 .+ 是打算弄来干嘛的, 为虾米不匹配了再检查下, 小测试了下, 你的 正则生成的状态数是 10K 左右, 去掉 .+ 状态数是 900 左右... 正则里的 .* .+ 绝对不是好玩的玩意儿...
Aniao 2010-10-27
  • 打赏
  • 举报
回复
那说明LZ的猜测是对的
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
楼上的 正则".*" 这个太简单

文档里是这么说的:
异常:如果对于N字符长度表达式匹配的复杂度超过O(N2)
linsen_519 2010-10-27
  • 打赏
  • 举报
回复
你要稳当的把文件内容存入string 不要用rebuf
简单写了一段代码 跑1600多行的文件没异常抛出。
string line;
string tmp;
ifstream fin("/home/linsen/桌面/wori");
while (getline(fin,tmp)){
line+=tmp;
}
boost::regex e(".*", boost::regex::icase);
boost::smatch m;
bool matched=boost::regex_match(line,m,e,boost::match_default);
cout<<matched<<endl;
if (matched) {
for (size_t i = 0; i < m.size(); ++i) {
cout << m[i] << endl;
}
} else
cout << "no matched" << endl;
}
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
Throws: std::runtime_error if the complexity of matching the expression against an N character string begins to exceed O(N2), or if the program runs out of stack space while matching the expression (if Boost.Regex is configured in recursive mode), or if the matcher exhausts its permitted memory allocation (if Boost.Regex is configured in non-recursive mode).
异常:如果对于N字符长度表达式匹配的复杂度超过O(N2),或者表达式匹配时发生栈空间溢出 (如果 Boost.Regex 设置为递归模式),或者匹配器耗尽了所允许申请的内存(如果 Boost.Regex 设置为非递归模式)时, 会抛出 std::runtime_error 异常。

--------------------------------------
所以说不要匹配太复杂的数据,或者太过冗长的
linsen_519 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 leeeryan 的回复:]

string szStr ; //从文件里读
string szReg = ".+document\.createElement\(.*\).+";
boost::regex reg(szReg);
return boost::regex_match(szStr,reg);
[/Quote]
你是如何把一个文件里的内容一下子都存入string的?rebuf()吗?
string szStr ; //从文件里读
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 taodm 的回复:]

你从20cm跳下来没事,从20层跳下来有事,你怪楼有问题?
[/Quote]

我就是问 我能不能从20层跳下来啊?
因为boost regex的regex_match 文档里没说我不能从超过20层的地方往下跳啊!
也没讲他最大能支持的楼层啊!
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
你们有兴趣可以找个 几千行的网页试试
肯定能断到这:
if(state_count > max_state_count)
raise_error(traits_inst, regex_constants::error_complexity);

max_state_count是个常量,多大我就不记得了!
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
string szStr ; //从文件里读
string szReg = ".+document\.createElement\(.*\).+";
boost::regex reg(szReg);
return boost::regex_match(szStr,reg);
linsen_519 2010-10-27
  • 打赏
  • 举报
回复
LZ 是挺可怜的...按的你说法貌似boost.regex确有这样的BUG了?还是你自己的思维定势啊?
要不你把 关键代码贴出来看一下吧
taodm 2010-10-27
  • 打赏
  • 举报
回复
你从20cm跳下来没事,从20层跳下来有事,你怪楼有问题?
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
可能问题就出在后面200行里,我又把前面200行拷贝过来,又测还是这样,那个正则也很简单,没用到什么高级语法,最多就匹配不到,怎么会assert呢?
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
同样一个文件,只匹配前面1000行,没有问题,匹配前面1200行就Assert在boost.regex里了。你说怎么会是我正则的问题?

emptyness 2010-10-27
  • 打赏
  • 举报
回复
呃... 郁闷的楼主. 你换点其它数据测试下.个人感觉不会是太长的原因.因为boost::regex没有说明它限制长度. 不过抛错的地方看起来很像,哈哈.
你查查max_state_count是常量吗?怎么定义的.
taodm 2010-10-27
  • 打赏
  • 举报
回复
算了,你去http://blog.csdn.net/lxcnn 过客 的blog补课吧。
你对正则缺太多的基础了解了。
leeeryan 2010-10-27
  • 打赏
  • 举报
回复
晕,不是这个原因,剪掉几行(任意位置)就可以了
taodm 2010-10-27
  • 打赏
  • 举报
回复
你正则表达式写错了呗。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧