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

前端之家收集整理的这篇文章主要介绍了ruby – 在每行上针对多个(15)正则表达式解析文本正文的最佳方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个我必须扫描的文本正文,每行包含至少2个,有时包含4个部分的信息.问题是每行可以是15-20个不同动作中的1个.

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

收集此信息后,每个操作都会转换为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和手工编码如果它是微不足道的.

祝好运

猜你在找的Ruby相关文章