首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在regex中使用通配符会导致扫描效率低下。

在regex中使用通配符会导致扫描效率低下。
EN

Stack Overflow用户
提问于 2016-07-14 21:09:16
回答 2查看 84关注 0票数 1

我有一个文本文件(大小为7GB +),其中包含重复的行,如下所示,其中10.00和2.00可能与每一行不同:

代码语言:javascript
复制
startline money earned 10.00 "300 plus nums n words here" money start 2.00 more words

我想得到10.00和2.00的值

我的正则表达式如下所示:

代码语言:javascript
复制
money earned ([0-9\.]+).*money start ([0-9\.]+)

但这是荒谬的低效。我花了将近30分钟来扫描1%的文本文件!.*似乎是造成这种低效率的原因。因此,我选择了通过使用2条单独的regex行来获得这些值,如下所示,这同样有效,而且效率要高得多。

代码语言:javascript
复制
money earned ([0-9\.]+) //this is line 1 capturing 10.00
money start ([0-9\.]+)  //this is line 2 capturing 2.00

但这会导致挣来的钱(10.00)首先被捕获,因为它是每行的第一部分,而money start (2.00)则是第二位。

我想要扭转这一点,并能够捕获货币开始(2.00)的每一行和钱赚(10.00)作为第二。有什么办法,我可以扭转的正则表达式,从后面的线,并移动到前面。或者,无论如何,当我用一行正则表达式进行扫描时,我可以克服效率低下的问题吗?

EN

回答 2

Stack Overflow用户

发布于 2016-07-15 06:41:11

在java程序接管之前,您能够预处理您的文件吗?

我使用示例作为模板创建了一个7.1GB文件。然后,我使用grep对其进行预处理,以创建一个中间文件,然后java可以更容易地处理该文件。

代码语言:javascript
复制
time grep -Eo 'money (earned|start) \d+\.\d+' large_file.txt > results.txt

real    3m12.306s
user    3m7.701s
sys     0m3.222s

results.txt文件仅需三分钟即可创建,只有168米,格式为:

代码语言:javascript
复制
money earned 10.00
money start 2.00
money earned 10.00
money start 2.00 
money earned 10.00
money start 2.00
票数 0
EN

Stack Overflow用户

发布于 2016-07-15 06:54:49

代码语言:javascript
复制
money earned ([0-9\.]+).*money start ([0-9\.]+)
                       ^^

这是你的问题。这是一场贪婪的比赛。这意味着它在回溯之前尽可能多地开始匹配,并尝试较短的匹配以允许其余的正则表达式匹配。因此,如果您有大量的数据,或者很长的行(甚至是很长的字符串,这取决于.是否匹配换行),这可能需要一段时间。这也在一定程度上取决于数据的外观。如果在上一次money start之后出现了大量文本,那么需要花费更长的时间。如果行中有多个money start,则跳过除最后一个之外的所有内容。

您可以尝试使用.*?,这是一个懒惰的匹配,也就是说,它从尽可能少的开始并扩展它。在许多情况下,这要快得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38384304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档