我有一个文本文件(大小 7GB 以上),其中包含重复的行,如下所示,其中每行 10.00 和 2.00 可能不同:
startline money earned 10.00 "300 plus nums n words here" money start 2.00 more words
我想获取值10.00和2.00
我的正则表达式如下,有效:
money earned ([0-9\.]+).*money start ([0-9\.]+)
但这效率低得离谱。我花了近 30 分钟扫描了文本文件的 1%!看来 .*
导致了这种低效率。因此,我选择通过使用 2 个单独的正则表达式行来获取这些值,如下所示,这也有效并且效率更高。
money earned ([0-9\.]+) //this is line 1 capturing 10.00
money start ([0-9\.]+) //this is line 2 capturing 2.00
但这会导致赚到的钱 (10.00) 首先被捕获,因为它是每行的第一部分,而开始的钱 (2.00) 最终成为第二个。
我想扭转这种情况,并能够首先捕获每行的开始资金 (2.00),然后捕获赚取的资金 (10.00)。有什么方法可以反转正则表达式,从行尾开始移动到前面。或者,无论如何我可以克服使用单行正则表达式扫描时的低效率问题?
最佳答案
您能够在 Java 程序接管之前预处理您的文件吗?
我使用您的示例作为模板创建了一个 7.1 GB 的文件。然后,我使用 grep 对其进行预处理,以创建一个中间文件,然后可以通过 java 更轻松地处理该中间文件。
time grep -Eo 'money (earned|start) \d+\.\d+' large_file.txt > results.txt
real 3m12.306s
user 3m7.701s
sys 0m3.222s
results.txt
文件的创建只花了大约三分钟,只有168M,格式为:
money earned 10.00
money start 2.00
money earned 10.00
money start 2.00
money earned 10.00
money start 2.00
关于java - 在正则表达式中使用通配符会导致扫描效率低下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38384304/