我有一个我必须扫描的文本正文,每行包含至少2个,有时包含4个部分的信息.问题是每行可以是15-20个不同动作中的1个.
text.split("\n").each do |line| #around 20 times.. .............. expressions['actions'].each do |pat,reg| #around 20 times .................
这显然是“问题”.
通过将所有正则表达式合并为一个,我确实设法让它更快(在C中以50%的保证金)但这仍然不是我需要的速度 – 我需要快速解析数千个这些文件!
现在我将它们与正则表达式匹配 – 但这是无法忍受的缓慢.我从ruby开始跳到C,希望我能得到一个速度提升而且它不会发生.
我随便读了关于PEG和基于语法的解析但看起来有点难以实现.这是我应该走的方向还是有不同的路线?
基本上我正在解析扑克手牌历史,手牌历史的每一行通常都包含我需要收集的2-3位信息:
玩家是谁,行动需要多少钱或什么卡等等..
需要解析的示例文本:
buriedtens posts $5 The button is in seat #4 *** HOLE CARDS *** Dealt to Mayhem 31337 [8s Ad] Sherwin7 folds OneMiKeee folds syhg99 calls $5 buriedtens raises to $10
收集此信息后,每个操作都会转换为xml节点.
现在我的ruby实现比我的更快,但这是可能的.只是因为我没有用c代码写了超过4 – 5年
更新:
我不想在这里发布所有代码,但到目前为止我的手/秒看起来如下:
588 hands/second -- boost::spirit in c++ 60 hands/second -- 1 very long and complicated regex in c++ (all the regexen put together) 33 hands/second -- normal regex style in ruby
我正在测试antlr,看看我们是否可以继续进行,但截至目前我对精神的结果非常满意.
相关问题:Efficiently querying one string against multiple regexes.
解决方法
我会建议
> Boost Spirit或
> Antlr如果语法复杂;
> Xpressive如果它更简单一点,
> Tokenizer和手工编码如果它是微不足道的.
祝好运