java - 在正则表达式中使用通配符会导致扫描效率低下

标签 java regex

我有一个文本文件(大小 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/

相关文章:

python - python中数字范围的正则表达式

r - 提取字符串的一部分,以 4 位数字开头,以句点结尾

java - 修改 SQL 语句的字符串输出

java - 当字符串大时,两个字符串的 XOR 不起作用

java - 下面的作业有什么作用?

java - Lambda 运算符 () -> 如何工作?

python - Pandas 数据框中的正则表达式

java - 字符串操作编码建议

java - 我该如何解决时区和 SSL 的问题

java - 通过将字符串(来自数组)分配为对象的参数之一,将其他参数保留为空,将字符串数组转换为对象列表