我有一段文本需要扫描,每行至少包含 2 部分信息,有时包含 4 部分信息。问题是每一行可能是 15-20 种不同操作中的一种。
在 ruby 中,当前代码看起来像这样:
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
在我收集这些信息后,每个 Action 都变成了一个 xml 节点。
现在我的 ruby 实现比我的 C++ 快得多,但这是有可能的。只是因为我已经有 4-5 年多没有用 C 代码编写代码了
更新: 我不想在这里发布所有代码,但到目前为止我的手/秒看起来如下所示:
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,看看我们是否可以更进一步,但截至目前,我对 spirit 的结果非常满意。
相关问题:Efficiently querying one string against multiple regexes.
最佳答案
关于ruby - 针对每一行的多个(15+)正则表达式解析文本正文的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/303830/