我有一个我必须扫描的文本正文,每行包含至少2个,有时是4个部分的信息.问题是每行可以是15-20个不同动作中的1个.
在ruby中,当前代码看起来有点像这样:
text.split("\n").each do |line| #around 20 times.. .............. expressions['actions'].each do |pat, reg| #around 20 times .................
这显然是"问题".通过将所有regexen合并为一个,我确实设法让它更快(在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++快得多,但这是可能的.只是因为我没有用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,看看我们是否可以继续进行,但是现在我对精神的结果非常满意.
相关问题:针对多个正则表达式有效查询一个字符串.
我会建议
提升精神或
如果语法很复杂,那就是Antlr ;
如果它更简单一点,那就是Xpressive
Tokenizer和手工编写的代码,如果它是微不足道的.
祝好运