ruby - 针对每一行的多个(15+)正则表达式解析文本正文的最佳方法是什么?

标签 ruby regex performance parsing peg

我有一段文本需要扫描,每行至少包含 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/

相关文章:

ruby - 使用 gsub 去除多个字符

regex - Perl 正则表达式用新行拆分

java - 如何使用正则表达式删除文件中的重复单词(单词不连续)?

javascript - Reg Exp 不允许字符串中出现三个或更多连续数字

javascript - Sencha Touch 2 - Android 性能

ruby-on-rails - 任何来源中的 Rails : Could not find minitest-4. 7.5

css - 使用 Nokogiri 解析时消除 CSS 选择器?

ruby - 使用 axlsx gem 执行 .add_row 后如何获取行索引?

Python 我如何使列表追加/扩展更快?

android - ActivityManager.MemoryInfo 和/proc/meminfo 文件有不同的值