当前位置:  开发笔记 > 后端 > 正文

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

如何解决《解析每行上多个(15+)正则表达式的文本正文的最佳方法是什么?》经验,为你挑选了1个好方法。

我有一个我必须扫描的文本正文,每行包含至少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,看看我们是否可以继续进行,但是现在我对精神的结果非常满意.

相关问题:针对多个正则表达式有效查询一个字符串.



1> call me Stev..:

我会建议

提升精神或

如果语法很复杂,那就是Antlr ;

如果它更简单一点,那就是Xpressive

Tokenizer和手工编写的代码,如果它是微不足道的.

祝好运

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有