我有一段必须扫描的文本,每行至少包含 2 部分,有时包含 4 部分信息。问题是每行可以是 15-20 个不同动作中的 1 个。
在 ruby 中,当前代码看起来有点像这样:
text.split("\n").each 做 |line| #大约20次.. ..................... 表达式['actions'].each 执行 |pat, reg| #大约20次 .....................
这显然是“问题”。我确实设法通过将所有正则表达式组合成一个来使其更快(在 C++ 中提高 50%),但这仍然不是我需要的速度——我需要快速解析数千个这些文件!
现在我将它们与正则表达式相匹配——但这太慢了。我从 ruby 开始,然后跳到 C++,希望能提高速度,但它并没有发生。
我随便阅读了有关 PEG 和基于语法的解析,但它看起来有点难以实现。这是我应该去的方向还是有不同的路线?
基本上我正在解析扑克手牌历史,手牌历史的每一行通常包含我需要收集的 2-3 位信息:玩家是谁,多少钱或行动需要什么牌......等等。
需要解析的示例文本:
掩埋帖子 $5 按钮在座位 #4 *** 洞牌 *** 处理混乱 31337 [8s 广告] 宣威7折 OneMiKee 折叠 syhg99 通话 $5 掩埋场加注到 10 美元
在我收集了这些信息之后,每个动作都会变成一个 xml 节点。
现在我的 ruby 实现比我的 C++ 快得多,但这很可能。只是因为我已经 4 到 5 年没有用 c 代码编写了
更新: 我不想在这里发布所有代码,但到目前为止,我的手/秒如下所示:
588 手/秒——c++ 中的 boost::spirit 60 手/秒——1 个非常长且复杂的 C++ 正则表达式(所有正则表达式放在一起) 33 手/秒——ruby 中的正常正则表达式样式
我目前正在测试 antlr,看看我们是否可以走得更远,但到目前为止,我对 Spirit 的结果非常满意。
相关问题:针对多个正则表达式有效地查询一个字符串。